;feat: bin: hledger-check-postable
This commit is contained in:
parent
497ad6e469
commit
8b121bcf74
@ -123,6 +123,18 @@ interprets all tag values containing a `/` (forward slash) as file paths, and ch
|
|||||||
[`hledger-check-tagfiles.cabal.hs`](https://github.com/simonmichael/hledger/blob/master/bin/hledger-check-tagfiles.cabal.hs)
|
[`hledger-check-tagfiles.cabal.hs`](https://github.com/simonmichael/hledger/blob/master/bin/hledger-check-tagfiles.cabal.hs)
|
||||||
is the same command implemented as a cabal script rather than a stack script.
|
is the same command implemented as a cabal script rather than a stack script.
|
||||||
|
|
||||||
|
### hledger-check-postable
|
||||||
|
|
||||||
|
[`hledger-check-postable.hs`](https://github.com/simonmichael/hledger/blob/master/bin/hledger-check-postable.hs)
|
||||||
|
check that no postings are made to accounts declared with a `postable:n` or `postable:no` tag.
|
||||||
|
This can be used as a workaround when you must declare a parent account to control display order,
|
||||||
|
but you don't want to allow postings to it. Eg, to allow postings to assets:cash but not assets
|
||||||
|
(remember that account tags are inherited):
|
||||||
|
```journal
|
||||||
|
account assets ; postable:n
|
||||||
|
account assets:cash ; postable:
|
||||||
|
```
|
||||||
|
|
||||||
### hledger-check-fancyassertions
|
### hledger-check-fancyassertions
|
||||||
|
|
||||||
[`hledger-check-fancyassertions.hs`](https://github.com/simonmichael/hledger/blob/master/bin/hledger-check-fancyassertions.hs)
|
[`hledger-check-fancyassertions.hs`](https://github.com/simonmichael/hledger/blob/master/bin/hledger-check-fancyassertions.hs)
|
||||||
|
|||||||
72
bin/hledger-check-postable.hs
Executable file
72
bin/hledger-check-postable.hs
Executable file
@ -0,0 +1,72 @@
|
|||||||
|
#!/usr/bin/env stack
|
||||||
|
-- stack runghc --verbosity info --package hledger-lib --package hledger --package string-qq --package safe --package text
|
||||||
|
|
||||||
|
-- --package time
|
||||||
|
|
||||||
|
{-# LANGUAGE NamedFieldPuns #-}
|
||||||
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
|
{-# LANGUAGE QuasiQuotes #-}
|
||||||
|
{-# LANGUAGE RecordWildCards #-}
|
||||||
|
|
||||||
|
-- import Data.Either
|
||||||
|
import Data.Maybe
|
||||||
|
import Data.String.QQ (s)
|
||||||
|
import Text.Printf
|
||||||
|
import Control.Monad
|
||||||
|
import Data.List
|
||||||
|
import qualified Data.Text as T
|
||||||
|
-- import Data.Time.Calendar
|
||||||
|
import Safe
|
||||||
|
import System.Exit
|
||||||
|
import Hledger
|
||||||
|
import Hledger.Cli
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
cmdmode :: Mode RawOpts
|
||||||
|
cmdmode = hledgerCommandMode
|
||||||
|
[s| check-postable
|
||||||
|
Check that no postings are made to accounts with a postable:(n|no) tag.
|
||||||
|
|
||||||
|
_FLAGS
|
||||||
|
|]
|
||||||
|
[]
|
||||||
|
[generalflagsgroup1]
|
||||||
|
[]
|
||||||
|
([], Nothing) -- Just $ argsFlag "[QUERY]")
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
opts@CliOpts{reportspec_=_rspec} <- getHledgerCliOpts cmdmode
|
||||||
|
withJournalDo opts $ \j -> do
|
||||||
|
let
|
||||||
|
postedaccts = journalAccountNamesUsed j
|
||||||
|
checkAcctPostable :: Journal -> AccountName -> Either AccountName ()
|
||||||
|
checkAcctPostable j a =
|
||||||
|
case lookup "postable" $ journalInheritedAccountTags j a of
|
||||||
|
Just v | T.toLower v `elem` ["no","n"] -> Left a
|
||||||
|
_ -> Right ()
|
||||||
|
case mapM_ (checkAcctPostable j) postedaccts of
|
||||||
|
Right () -> exitSuccess
|
||||||
|
Left a -> putStrLn errmsg >> exitFailure
|
||||||
|
where
|
||||||
|
firstp = headDef (error' "(unexpected: missing account)") $ -- PARTIAL: shouldn't happen
|
||||||
|
filter ((==a).paccount) $ journalPostings j
|
||||||
|
errmsg = chomp $ printf
|
||||||
|
(unlines [
|
||||||
|
"%s:%d:"
|
||||||
|
,"%s\n"
|
||||||
|
,"The postable check is enabled, so postings are disallowed in accounts with"
|
||||||
|
,"a postable:n (or postable:no) tag. This account (or one of its parents) was"
|
||||||
|
,"declared with that tag:"
|
||||||
|
,"%s"
|
||||||
|
,""
|
||||||
|
,"%s"
|
||||||
|
])
|
||||||
|
f l (textChomp excerpt) a recommendation
|
||||||
|
where
|
||||||
|
(f,l,_mcols,excerpt) = makePostingAccountErrorExcerpt firstp
|
||||||
|
recommendation = chomp $ unlines [
|
||||||
|
"Consider posting to a more specific account, or removing the postable: tag"
|
||||||
|
,"from the appropriate account directive."
|
||||||
|
]
|
||||||
Loading…
Reference in New Issue
Block a user