mirror of
https://github.com/simonmichael/hledger.git
synced 2024-12-27 12:24:43 +03:00
Anon feature (#412)
* Add anon flag to cli * Implement anonymisation for accounts * document the --anon option
This commit is contained in:
parent
6b0972b752
commit
8fdea5d11a
@ -147,6 +147,9 @@ m4_define({{_reportingoptions_}}, {{
|
||||
: will transform the journal before any other processing by replacing the account name of every posting having the tag TAG with content VALUE by the account name "TAG:VALUE".
|
||||
: The TAG will only match if it is a full-length match. The pivot will only happen if the TAG is on a posting, not if it is on the transaction. If the tag value is a multi:level:account:name the new account name will be "TAG:multi:level:account:name".
|
||||
|
||||
`--anon`
|
||||
: show anonymized accounts and payees
|
||||
|
||||
}} )m4_dnl
|
||||
m4_dnl
|
||||
m4_define({{_hledgerdescription_}}, {{
|
||||
|
@ -143,6 +143,7 @@ reportflags = [
|
||||
,flagReq ["depth"] (\s opts -> Right $ setopt "depth" s opts) "N" "hide accounts/postings deeper than N"
|
||||
,flagNone ["empty","E"] (setboolopt "empty") "show items with zero amount, normally hidden"
|
||||
,flagNone ["cost","B"] (setboolopt "cost") "show amounts in their cost price's commodity"
|
||||
,flagNone ["anon"] (setboolopt "anon") "output ledger with anonymized accounts and payees."
|
||||
]
|
||||
|
||||
-- | Common output-related flags: --output-file, --output-format...
|
||||
|
@ -23,12 +23,15 @@ module Hledger.Cli.Utils
|
||||
)
|
||||
where
|
||||
import Control.Exception as C
|
||||
import Data.Hashable (hash)
|
||||
import Data.List
|
||||
import Data.Maybe
|
||||
import Data.Text (Text)
|
||||
import qualified Data.Text as T
|
||||
import qualified Data.Text.IO as T
|
||||
import Data.Time (Day)
|
||||
import Data.Word
|
||||
import Numeric
|
||||
import Safe (readMay)
|
||||
import System.Console.CmdArgs
|
||||
import System.Directory (getModificationTime, getDirectoryContents, copyFile)
|
||||
@ -73,7 +76,7 @@ withJournalDo opts cmd = do
|
||||
rulespath <- rulesFilePathFromOpts opts
|
||||
journalpaths <- journalFilePathFromOpts opts
|
||||
ej <- readJournalFiles Nothing rulespath (not $ ignore_assertions_ opts) journalpaths
|
||||
either error' (cmd opts . pivotByOpts opts . journalApplyAliases (aliasesFromOpts opts)) ej
|
||||
either error' (cmd opts . pivotByOpts opts . anonymiseByOpts opts . journalApplyAliases (aliasesFromOpts opts)) ej
|
||||
|
||||
-- | Apply the pivot transformation on a journal, if option is present.
|
||||
pivotByOpts :: CliOpts -> Journal -> Journal
|
||||
@ -92,6 +95,30 @@ pivot tag j = j{jtxns = map pivotTrans . jtxns $ j}
|
||||
| _ <- tagTuple = p
|
||||
where tagTuple = find ((tag ==) . fst) . ptags $ p
|
||||
|
||||
-- | Apply the anonymisation transformation on a journal, if option is present
|
||||
anonymiseByOpts :: CliOpts -> Journal -> Journal
|
||||
anonymiseByOpts opts =
|
||||
case maybestringopt "anon" . rawopts_ $ opts of
|
||||
Just _ -> anonymise
|
||||
Nothing -> id
|
||||
|
||||
-- | Apply the anonymisation transformation on a journal
|
||||
anonymise :: Journal -> Journal
|
||||
anonymise j
|
||||
= let
|
||||
pAnons p = p { paccount = T.intercalate (T.pack ":") . map anon . T.splitOn (T.pack ":") . paccount $ p
|
||||
, pcomment = T.empty
|
||||
, ptransaction = fmap tAnons . ptransaction $ p
|
||||
}
|
||||
tAnons txn = txn { tpostings = map pAnons . tpostings $ txn
|
||||
, tdescription = anon . tdescription $ txn
|
||||
, tcomment = T.empty
|
||||
}
|
||||
in
|
||||
j { jtxns = map tAnons . jtxns $ j }
|
||||
where
|
||||
anon = T.pack . flip showHex "" . (fromIntegral :: Int -> Word32) . hash
|
||||
|
||||
-- | Write some output to stdout or to a file selected by --output-file.
|
||||
writeOutput :: CliOpts -> String -> IO ()
|
||||
writeOutput opts s = do
|
||||
|
@ -98,6 +98,7 @@ library
|
||||
, cmdargs >=0.10 && <0.11
|
||||
, csv
|
||||
, data-default >=0.5
|
||||
, hashable >=1.2.4
|
||||
, haskeline >=0.6 && <=0.8
|
||||
, HUnit
|
||||
, mtl
|
||||
|
@ -111,6 +111,7 @@ library:
|
||||
- cmdargs >=0.10 && <0.11
|
||||
- csv
|
||||
- data-default >=0.5
|
||||
- hashable >=1.2.4
|
||||
- haskeline >=0.6 && <=0.8
|
||||
- HUnit
|
||||
- mtl
|
||||
|
Loading…
Reference in New Issue
Block a user