cli: ability to pass arguments to getHledgerCliOpts + two example scripts
This commit is contained in:
parent
9417ee625e
commit
54300328cd
@ -7,6 +7,8 @@ shipped as executable stack scripts:
|
||||
- hledger-check.hs - check more complex account balance assertions
|
||||
- hledger-smooth.hs - an attempt at automatically splitting infrequent/irregular transactions
|
||||
- hledger-swap-dates.hs - print transactions with their date and date2 fields swapped
|
||||
- hledger-combine-balances.hs - render two balance reports as single multi-column one
|
||||
- hledger-balance-as-budget.hs - use one balance report as the budget for the other one
|
||||
|
||||
You can run them directly and they will install required dependencies
|
||||
and run in interpreted mode.
|
||||
|
||||
46
bin/hledger-balance-as-budget.hs
Executable file
46
bin/hledger-balance-as-budget.hs
Executable file
@ -0,0 +1,46 @@
|
||||
#!/usr/bin/env stack
|
||||
{- stack runghc --verbosity info
|
||||
--package hledger-lib
|
||||
--package hledger
|
||||
-}
|
||||
|
||||
{-# OPTIONS_GHC -Wno-missing-signatures -Wno-name-shadowing #-}
|
||||
|
||||
{-| Construct two balance reports for two different time periods and use one of the as "budget" for
|
||||
the other, thus comparing them
|
||||
-}
|
||||
import System.Environment (getArgs)
|
||||
import Hledger.Cli
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
cmdmode = hledgerCommandMode
|
||||
(unlines ["balance-as-budget"
|
||||
,"Generate two balance reports and use first of them as budget for the second."
|
||||
," "
|
||||
,"Pass two sets of hledger-compatible options, separated by --."
|
||||
,"For example, to use Jan 2019 as budget for Jan 2020, use:"
|
||||
,"-f 2019.journal -p 2019-01 -- -f 2020.journal -p 2020-01"
|
||||
," "
|
||||
,"Display features in the report are driven by the second set of args"
|
||||
])
|
||||
[]
|
||||
[generalflagsgroup1]
|
||||
[]
|
||||
([], Just $ argsFlag "[QUERY]")
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
args <- getArgs
|
||||
let report1args = takeWhile (/= "--") args
|
||||
let report2args = drop 1 $ dropWhile (/= "--") args
|
||||
(_,report1) <- mbReport report1args
|
||||
(ropts2,report2) <- mbReport report2args
|
||||
let pastAsBudget = combineBudgetAndActual report1{prDates=prDates report2} report2
|
||||
putStrLn $ budgetReportAsText ropts2 pastAsBudget
|
||||
where
|
||||
mbReport args = do
|
||||
opts@CliOpts{reportopts_=ropts} <- getHledgerCliOpts' cmdmode args
|
||||
d <- getCurrentDay
|
||||
report <- withJournalDo opts (return . multiBalanceReport d ropts)
|
||||
return (ropts,report)
|
||||
75
bin/hledger-combine-balances.hs
Executable file
75
bin/hledger-combine-balances.hs
Executable file
@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env stack
|
||||
{- stack runghc --verbosity info
|
||||
--package hledger-lib
|
||||
--package hledger
|
||||
-}
|
||||
|
||||
{-# OPTIONS_GHC -Wno-missing-signatures -Wno-name-shadowing #-}
|
||||
|
||||
{-| Construct two balance reports for two different time periods and render them side by side
|
||||
-}
|
||||
import System.Environment (getArgs)
|
||||
import Hledger.Cli
|
||||
import qualified Data.Map as M
|
||||
import Data.Map.Merge.Strict
|
||||
|
||||
appendReports :: MultiBalanceReport -> MultiBalanceReport -> MultiBalanceReport
|
||||
appendReports r1 r2 =
|
||||
PeriodicReport
|
||||
{ prDates = prDates r1 ++ prDates r2
|
||||
, prRows = map snd $ M.toAscList mergedRows
|
||||
, prTotals = mergeRows (prTotals r1) (prTotals r2)
|
||||
}
|
||||
where
|
||||
rowsByAcct report = M.fromList $ map (\r -> (prrName r, r)) (prRows report)
|
||||
r1map = rowsByAcct r1
|
||||
r2map = rowsByAcct r2
|
||||
|
||||
mergedRows = merge (mapMissing left) (mapMissing right) (zipWithMatched both) r1map r2map
|
||||
left _ row = row{prrAmounts = prrAmounts row ++ [nullmixedamt]}
|
||||
right _ row = row{prrAmounts = nullmixedamt:(prrAmounts row) }
|
||||
both _ = mergeRows
|
||||
|
||||
-- name/depth in the second row would be the same by contruction
|
||||
mergeRows (PeriodicReportRow name depth amt1 tot1 avg1) (PeriodicReportRow _ _ amt2 tot2 avg2) =
|
||||
PeriodicReportRow { prrName = name
|
||||
, prrDepth = depth
|
||||
, prrAmounts = amt1++amt2
|
||||
, prrTotal = tot1+tot2
|
||||
, prrAverage = averageMixedAmounts [avg1,avg2]
|
||||
}
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
cmdmode = hledgerCommandMode
|
||||
(unlines ["combine-balances"
|
||||
,"Generate two balance reports and render them side by side."
|
||||
,"(Dates in headers could look funky.)"
|
||||
," "
|
||||
,"Pass two sets of hledger-compatible options, separated by --."
|
||||
,"For example, to see Jan 2019 and Jan 2020 together, use:"
|
||||
,"-f 2019.journal -p 2019-01 -- -f 2020eaf.journal -p 2020-01"
|
||||
," "
|
||||
,"Display features in the report are driven by the second set of args"
|
||||
])
|
||||
[]
|
||||
[generalflagsgroup1]
|
||||
[]
|
||||
([], Just $ argsFlag "[QUERY]")
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
args <- getArgs
|
||||
let report1args = takeWhile (/= "--") args
|
||||
let report2args = drop 1 $ dropWhile (/= "--") args
|
||||
(_,report1) <- mbReport report1args
|
||||
(ropts2,report2) <- mbReport report2args
|
||||
let merged = appendReports report1 report2
|
||||
putStrLn $ multiBalanceReportAsText ropts2 merged
|
||||
where
|
||||
mbReport args = do
|
||||
opts@CliOpts{reportopts_=ropts} <- getHledgerCliOpts' cmdmode args
|
||||
d <- getCurrentDay
|
||||
report <- withJournalDo opts (return . multiBalanceReport d ropts)
|
||||
return (ropts,report)
|
||||
@ -35,6 +35,7 @@ module Hledger.Cli.CliOptions (
|
||||
CliOpts(..),
|
||||
defcliopts,
|
||||
getHledgerCliOpts,
|
||||
getHledgerCliOpts',
|
||||
rawOptsToCliOpts,
|
||||
checkCliOpts,
|
||||
outputFormats,
|
||||
@ -479,9 +480,8 @@ checkCliOpts opts =
|
||||
-- Empty lines in the pre/postamble are removed by cmdargs;
|
||||
-- add a space character to preserve them.
|
||||
--
|
||||
getHledgerCliOpts :: Mode RawOpts -> IO CliOpts
|
||||
getHledgerCliOpts mode' = do
|
||||
args' <- getArgs >>= expandArgsAt
|
||||
getHledgerCliOpts' :: Mode RawOpts -> [String] -> IO CliOpts
|
||||
getHledgerCliOpts' mode' args' = do
|
||||
let rawopts = either usageError id $ process mode' args'
|
||||
opts <- rawOptsToCliOpts rawopts
|
||||
debugArgs args' opts
|
||||
@ -508,6 +508,11 @@ getHledgerCliOpts mode' = do
|
||||
d <- getCurrentDay
|
||||
putStrLn $ "search query: " ++ show (queryFromOpts d $ reportopts_ opts)
|
||||
|
||||
getHledgerCliOpts :: Mode RawOpts -> IO CliOpts
|
||||
getHledgerCliOpts mode' = do
|
||||
args' <- getArgs >>= expandArgsAt
|
||||
getHledgerCliOpts' mode' args'
|
||||
|
||||
-- CliOpts accessors
|
||||
|
||||
-- | Get the (tilde-expanded, absolute) journal file path from
|
||||
|
||||
Loading…
Reference in New Issue
Block a user