packages feed

hledger 1.10 → 1.11

raw patch · 52 files changed

+1856/−1213 lines, 52 filesdep +easytestdep +statisticsdep −HUnitdep −csvdep ~hledger-libPVP ok

version bump matches the API change (PVP)

Dependencies added: easytest, statistics

Dependencies removed: HUnit, csv

Dependency ranges changed: hledger-lib

API changes (from Hackage documentation)

- Hledger.Cli: tests_Hledger_Cli :: Test
- Hledger.Cli.CliOptions: tests_Hledger_Cli_CliOptions :: Test
- Hledger.Cli.Commands: tests_Hledger_Cli_Commands :: Test
- Hledger.Cli.Commands.Accounts: tests_Hledger_Cli_Commands_Accounts :: Test
- Hledger.Cli.Commands.Balance: tests_Hledger_Cli_Commands_Balance :: Test
- Hledger.Cli.Commands.Balancesheet: tests_Hledger_Cli_Commands_Balancesheet :: Test
- Hledger.Cli.Commands.Cashflow: tests_Hledger_Cli_Commands_Cashflow :: Test
- Hledger.Cli.Commands.Checkdates: tests_Hledger_Cli_Commands_Checkdates :: Test
- Hledger.Cli.Commands.Incomestatement: tests_Hledger_Cli_Commands_Incomestatement :: Test
- Hledger.Cli.Commands.Print: tests_Hledger_Cli_Commands_Print :: Test
- Hledger.Cli.Commands.Register: tests_Hledger_Cli_Commands_Register :: Test
- Hledger.Cli.Utils: TestList :: [Test] -> Test
- Hledger.Cli.Utils: data Test
- Hledger.Cli.Utils: generateAutomaticPostings :: Journal -> Journal
+ Hledger.Cli: tests_Cli :: Test ()
+ Hledger.Cli.Commands: testcmd :: CliOpts -> Journal -> IO ()
+ Hledger.Cli.Commands: tests_Commands :: Test ()
+ Hledger.Cli.Commands.Balance: tests_Balance :: Test ()
+ Hledger.Cli.Commands.Files: files :: CliOpts -> Journal -> IO ()
+ Hledger.Cli.Commands.Files: filesmode :: Mode RawOpts
+ Hledger.Cli.Commands.Register: tests_Register :: Test ()
+ Hledger.Cli.Commands.Roi: instance GHC.Show.Show Hledger.Cli.Commands.Roi.OneSpan
+ Hledger.Cli.Commands.Roi: roi :: CliOpts -> Journal -> IO ()
+ Hledger.Cli.Commands.Roi: roimode :: Mode RawOpts
- Hledger.Cli.DocFiles: docFiles :: IsString a => [(Topic, (a, a, a))]
+ Hledger.Cli.DocFiles: docFiles :: [(Topic, (ByteString, ByteString, ByteString))]
- Hledger.Cli.DocFiles: lookupDocInfo :: IsString a => Topic -> a
+ Hledger.Cli.DocFiles: lookupDocInfo :: Topic -> ByteString
- Hledger.Cli.DocFiles: lookupDocNroff :: IsString a => Topic -> a
+ Hledger.Cli.DocFiles: lookupDocNroff :: Topic -> ByteString
- Hledger.Cli.DocFiles: lookupDocTxt :: IsString a => Topic -> a
+ Hledger.Cli.DocFiles: lookupDocTxt :: Topic -> ByteString

Files

CHANGES view
@@ -1,6 +1,61 @@ User-visible changes in the hledger command line tool.  +# 1.11 (2018/9/30)++* The default display order of accounts is now influenced by+  the order of account directives. Accounts declared by account+  directives are displayed first (top-most), in declaration order,+  followed by undeclared accounts in alphabetical order. Numeric+  account codes are no longer used, and are ignored and considered+  deprecated.++  So if your accounts are displaying in a weird order after upgrading,+  and you want them alphabetical like before, just sort your account+  directives alphabetically.++* Account sorting (by name, by declaration, by amount) is now more+  robust and supported consistently by all commands (accounts,+  balance, bs..) in all modes (tree & flat, tabular & non-tabular).++* close: new --opening/--closing flags to print only the opening or+  closing transaction++* files: a new command to list included files++* prices: query arguments are now supported. Prices can be filtered by+  date, and postings providing transaction prices can also be filtered.++* rewrite: help clarifies relation to print --auto (#745)++* roi: a new command to compute return on investment, based on hledger-irr++* test: has more verbose output, more informative failure messages,+  and no longer tries to read the journal++* csv: We use a more robust CSV lib (cassava) and now support+  non-comma separators, eg --separator ';' (experimental, this flag+  will probably become a CSV rule) (#829)++* csv: interpolated field names in values are now properly case insensitive, so+  this works:++  fields  ...,Transaction_Date,...+  date %Transaction_Date++* journal: D (default commodity) directives no longer break multiplier+  amounts in transaction modifiers (AKA automated postings) (#860)++* journal: "Automated Postings" have been renamed to "Transaction Modifiers".++* journal: transaction comments in transaction modifier rules are now parsed correctly. (#745)++* journal: when include files form a cycle, we give an error instead+  of hanging.++* upper-case day/month names in period expressions no longer give an error (#847, #852)++ # 1.10 (2018/6/30)  * journal: many parse error messages have become more informative, and
Hledger/Cli.hs view
@@ -15,8 +15,8 @@                      module Hledger.Cli.DocFiles,                      module Hledger.Cli.Utils,                      module Hledger.Cli.Version,-                     tests_Hledger_Cli,                      module Hledger,+                     tests_Cli,                      module System.Console.CmdArgs.Explicit               ) where@@ -29,4 +29,7 @@ import Hledger.Cli.Utils import Hledger.Cli.Version -tests_Hledger_Cli = tests_Hledger_Cli_Commands+tests_Cli = tests "Cli" [+   tests_Hledger+  ,tests_Commands+ ]
Hledger/Cli/CliOptions.hs view
@@ -60,13 +60,9 @@   hledgerAddons,   topicForMode, -  -- * Tests-  tests_Hledger_Cli_CliOptions,- --  -- * Convenience re-exports --  module Data.String.Here, --  module System.Console.CmdArgs.Explicit,---  module Test.HUnit ) where @@ -96,7 +92,6 @@ import System.Environment import System.Exit (exitSuccess) import System.FilePath-import Test.HUnit import Text.Megaparsec import Text.Megaparsec.Char @@ -125,6 +120,7 @@ inputflags = [   flagReq  ["file","f"]      (\s opts -> Right $ setopt "file" s opts) "FILE" "use a different input file. For stdin, use - (default: $LEDGER_FILE or $HOME/.hledger.journal)"  ,flagReq  ["rules-file"]    (\s opts -> Right $ setopt "rules-file" s opts) "RFILE" "CSV conversion rules file (default: FILE.rules)"+ ,flagReq  ["separator"]     (\s opts -> Right $ setopt "separator" s opts) "SEPARATOR" "CSV separator (default: ,)"  ,flagReq  ["alias"]         (\s opts -> Right $ setopt "alias" s opts)  "OLD=NEW" "rename accounts named OLD to NEW"  ,flagNone ["anon"]          (setboolopt "anon") "anonymize accounts and payees"  ,flagReq  ["pivot"]         (\s opts -> Right $ setopt "pivot" s opts)  "TAGNAME" "use some other field/tag for account names"@@ -282,6 +278,7 @@   ,("vty", "start the curses-style interface")   ,("web", "start the web interface")   ,("accounts", "list account names")+  ,("files", "list included files")   ,("balance-csv", "output a balance report as CSV")   ,("close", "show a transaction entry zeroing all accounts")   ,("print-unique", "print only transactions with unique descriptions")@@ -707,9 +704,3 @@ --     d <- getCurrentDay --     putStrLn $ "search query: " ++ (show $ queryFromOpts d $ reportopts_ opts) --- tests--tests_Hledger_Cli_CliOptions :: Test-tests_Hledger_Cli_CliOptions = TestList- [- ]
Hledger/Cli/Commands.hs view
@@ -8,10 +8,11 @@  module Hledger.Cli.Commands (    findCommand+  ,testcmd   ,builtinCommands   ,builtinCommandNames   ,printCommandsList-  ,tests_Hledger_Cli_Commands+  ,tests_Commands   ,module Hledger.Cli.Commands.Accounts   ,module Hledger.Cli.Commands.Activity   ,module Hledger.Cli.Commands.Add@@ -36,7 +37,6 @@ )  where -import Control.Monad import Data.Default import Data.List import Data.List.Split (splitOn)@@ -47,11 +47,11 @@ import Data.Text (Text) import qualified Data.Text as T import Data.Time.Calendar+import qualified EasyTest import System.Console.CmdArgs.Explicit as C import System.Exit-import Test.HUnit -import Hledger+import Hledger  import Hledger.Cli.CliOptions import Hledger.Cli.Version import Hledger.Cli.Commands.Accounts@@ -64,6 +64,7 @@ import Hledger.Cli.Commands.Checkdates import Hledger.Cli.Commands.Checkdupes import Hledger.Cli.Commands.Close+import Hledger.Cli.Commands.Files import Hledger.Cli.Commands.Help import Hledger.Cli.Commands.Import import Hledger.Cli.Commands.Incomestatement@@ -73,6 +74,7 @@ import Hledger.Cli.Commands.Register import Hledger.Cli.Commands.Registermatch import Hledger.Cli.Commands.Rewrite+import Hledger.Cli.Commands.Roi import Hledger.Cli.Commands.Stats import Hledger.Cli.Commands.Tags @@ -93,6 +95,7 @@   ,(closemode              , close)   ,(helpmode               , help')   ,(importmode             , importcmd)+  ,(filesmode              , files)   ,(incomestatementmode    , incomestatement)   ,(pricesmode             , prices)   ,(printmode              , print')@@ -100,6 +103,7 @@   ,(registermode           , register)   ,(registermatchmode      , registermatch)   ,(rewritemode            , rewrite)+  ,(roimode                , roi)   ,(statsmode              , stats)   ,(tagsmode               , tags)   ,(testmode               , testcmd)@@ -213,116 +217,98 @@   concatMap (splitOn "|") [w | ' ':l <- lines s, let w:_ = words l]  ---- The test command, defined here so it can access other commands' tests.+-- The test command, defined here for easy access to other modules' tests. -testmode = (defCommandMode ["test"]) {-  modeHelp = "run built-in self-tests"- ,modeArgs = ([], Just $ argsFlag "[REGEXPS]")- ,modeGroupFlags = Group {-     groupUnnamed = []-    ,groupHidden = [-        flagNone ["tree"] (\opts -> setboolopt "tree" opts) "show tests hierarchically"-       ,flagNone ["flat"] (\opts -> setboolopt "flat" opts) "show tests as a flat list"-      ]-    ,groupNamed = [generalflagsgroup3]-    }- }+testmode = hledgerCommandMode+  [here| test+Run the unit tests built in to hledger-lib and hledger, +printing results on stdout and exiting with success or failure. --- | Run some or all hledger-lib and hledger unit tests, and exit with success or failure.-testcmd :: CliOpts -> Journal -> IO ()-testcmd opts _ = do-  let ts = -        (if tree_ $ reportopts_ opts then matchedTestsTree else matchedTestsFlat) -          opts tests_Hledger_Cli_Commands-  results <- liftM (fst . flip (,) 0) $ runTestTT ts-  if errors results > 0 || failures results > 0-    then exitFailure-    else exitWith ExitSuccess+If a scope argument is provided, only tests in that (exact, case-sensitive) +scope are run. --- | All or pattern-matched tests, as a flat list to show simple names.-matchedTestsFlat opts = TestList . -  filter (matchesAccount (queryFromOpts nulldate $ reportopts_ opts) . T.pack . testName) . -  flattenTests+If a numeric second argument is provided, it will set the randomness seed,+for any tests which use randomness. --- | All or pattern-matched tests, in the original suites to show hierarchical names.-matchedTestsTree opts = -  filterTests (matchesAccount (queryFromOpts nulldate $ reportopts_ opts) . T.pack . testName) +FLAGS+  |]+  []+  [generalflagsgroup3]+  []+  ([], Just $ argsFlag "[TESTPATTERN] [SEED]") +-- | See testmode.+--+-- Unlike other hledger commands, this one does not operate on the user's Journal.+-- For ease of implementation the Journal parameter remains in the type signature. +testcmd :: CliOpts -> Journal -> IO ()+testcmd opts _undefined = do +  let args = words' $ query_ $ reportopts_ opts+  e <- runEasytests args $ EasyTest.tests [tests_Hledger, tests_Commands]+  if e then exitFailure else exitSuccess --- collected hledger-lib + hledger unit tests+-- unit tests of hledger command-line executable -tests_Hledger_Cli_Commands :: Test-tests_Hledger_Cli_Commands = TestList [-   tests_Hledger-  ,tests_Hledger_Cli_CliOptions-  -- ,tests_Hledger_Cli_Commands_Activity-  -- ,tests_Hledger_Cli_Commands_Add-  ,tests_Hledger_Cli_Commands_Balance-  ,tests_Hledger_Cli_Commands_Balancesheet-  ,tests_Hledger_Cli_Commands_Cashflow-  ,tests_Hledger_Cli_Commands_Incomestatement-  ,tests_Hledger_Cli_Commands_Print-  ,tests_Hledger_Cli_Commands_Register-  -- ,tests_Hledger_Cli_Commands_Stats+tests_Commands = tests "Commands" [+   tests_Balance+  ,tests_Register    -- some more tests easiest to define here:   -  ,"apply account directive" ~: -    let ignoresourcepos j = j{jtxns=map (\t -> t{tsourcepos=nullsourcepos}) (jtxns j)} in-    let sameParse str1 str2 = do j1 <- readJournal def Nothing str1 >>= either error' (return . ignoresourcepos)-                                 j2 <- readJournal def Nothing str2 >>= either error' (return . ignoresourcepos)+  ,test "apply account directive" $ do +    let ignoresourcepos j = j{jtxns=map (\t -> t{tsourcepos=nullsourcepos}) (jtxns j)}+    let sameParse str1 str2 = do j1 <- io $ readJournal def Nothing str1 >>= either error' (return . ignoresourcepos)+                                 j2 <- io $ readJournal def Nothing str2 >>= either error' (return . ignoresourcepos)                                  j1 `is` j2{jlastreadtime=jlastreadtime j1, jfiles=jfiles j1} --, jparsestate=jparsestate j1}-    in sameParse-                         ("2008/12/07 One\n  alpha  $-1\n  beta  $1\n" <>-                          "apply account outer\n2008/12/07 Two\n  aigh  $-2\n  bee  $2\n" <>-                          "apply account inner\n2008/12/07 Three\n  gamma  $-3\n  delta  $3\n" <>-                          "end apply account\n2008/12/07 Four\n  why  $-4\n  zed  $4\n" <>-                          "end apply account\n2008/12/07 Five\n  foo  $-5\n  bar  $5\n"-                         )-                         ("2008/12/07 One\n  alpha  $-1\n  beta  $1\n" <>-                          "2008/12/07 Two\n  outer:aigh  $-2\n  outer:bee  $2\n" <>-                          "2008/12/07 Three\n  outer:inner:gamma  $-3\n  outer:inner:delta  $3\n" <>-                          "2008/12/07 Four\n  outer:why  $-4\n  outer:zed  $4\n" <>-                          "2008/12/07 Five\n  foo  $-5\n  bar  $5\n"-                         )+    sameParse+     ("2008/12/07 One\n  alpha  $-1\n  beta  $1\n" <>+      "apply account outer\n2008/12/07 Two\n  aigh  $-2\n  bee  $2\n" <>+      "apply account inner\n2008/12/07 Three\n  gamma  $-3\n  delta  $3\n" <>+      "end apply account\n2008/12/07 Four\n  why  $-4\n  zed  $4\n" <>+      "end apply account\n2008/12/07 Five\n  foo  $-5\n  bar  $5\n"+     )+     ("2008/12/07 One\n  alpha  $-1\n  beta  $1\n" <>+      "2008/12/07 Two\n  outer:aigh  $-2\n  outer:bee  $2\n" <>+      "2008/12/07 Three\n  outer:inner:gamma  $-3\n  outer:inner:delta  $3\n" <>+      "2008/12/07 Four\n  outer:why  $-4\n  outer:zed  $4\n" <>+      "2008/12/07 Five\n  foo  $-5\n  bar  $5\n"+     ) -  ,"apply account directive should preserve \"virtual\" posting type" ~: do-    j <- readJournal def Nothing "apply account test\n2008/12/07 One\n  (from)  $-1\n  (to)  $1\n" >>= either error' return+  ,test "apply account directive should preserve \"virtual\" posting type" $ do+    j <- io $ readJournal def Nothing "apply account test\n2008/12/07 One\n  (from)  $-1\n  (to)  $1\n" >>= either error' return     let p = head $ tpostings $ head $ jtxns j-    assertBool "" $ paccount p == "test:from"-    assertBool "" $ ptype p == VirtualPosting+    paccount p `is` "test:from"+    ptype p `is` VirtualPosting   -  ,"account aliases" ~: do-    j <- readJournal def Nothing "!alias expenses = equity:draw:personal\n1/1\n (expenses:food)  1\n" >>= either error' return+  ,test "account aliases" $ do+    j <- io $ readJournal def Nothing "!alias expenses = equity:draw:personal\n1/1\n (expenses:food)  1\n" >>= either error' return     let p = head $ tpostings $ head $ jtxns j-    assertBool "" $ paccount p == "equity:draw:personal:food"+    paccount p `is` "equity:draw:personal:food" -  ,"ledgerAccountNames" ~:+  ,test "ledgerAccountNames" $     ledgerAccountNames ledger7 `is`      ["assets","assets:cash","assets:checking","assets:saving","equity","equity:opening balances",       "expenses","expenses:food","expenses:food:dining","expenses:phone","expenses:vacation",       "liabilities","liabilities:credit cards","liabilities:credit cards:discover"] -  -- ,"journalCanonicaliseAmounts" ~:+  -- ,test "journalCanonicaliseAmounts" ~:   --  "use the greatest precision" ~:   --   (map asprecision $ journalAmountAndPriceCommodities $ journalCanonicaliseAmounts $ journalWithAmounts ["1","2.00"]) `is` [2,2]    -- don't know what this should do-  -- ,"elideAccountName" ~: do+  -- ,test "elideAccountName" ~: do   --    (elideAccountName 50 "aaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaa"   --     `is` "aa:aaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaa")   --    (elideAccountName 20 "aaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaa:aaaaaaaaaaaaaaaaaaaa"   --     `is` "aa:aa:aaaaaaaaaaaaaa") -  ,"default year" ~: do-    j <- readJournal def Nothing defaultyear_journal_txt >>= either error' return+  ,test "default year" $ do+    j <- io $ readJournal def Nothing defaultyear_journal_txt >>= either error' return     tdate (head $ jtxns j) `is` fromGregorian 2009 1 1-    return () -  ,"show dollars" ~: showAmount (usd 1) ~?= "$1.00"+  ,test "show dollars" $ showAmount (usd 1) `is` "$1.00" -  ,"show hours" ~: showAmount (hrs 1) ~?= "1.00h"+  ,test "show hours" $ showAmount (hrs 1) `is` "1.00h"   ] 
Hledger/Cli/Commands/Accounts.hs view
@@ -10,27 +10,25 @@  -} +{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE CPP #-}  module Hledger.Cli.Commands.Accounts (   accountsmode  ,accounts- ,tests_Hledger_Cli_Commands_Accounts ) where -import Data.List #if !(MIN_VERSION_base(4,11,0)) import Data.Monoid #endif--- import Data.Text (Text)+import Data.List import qualified Data.Text as T+import qualified Data.Text.IO as T import System.Console.CmdArgs.Explicit as C-import Test.HUnit  import Hledger-import Prelude hiding (putStrLn)-import Hledger.Utils.UTF8IOCompat (putStrLn) import Hledger.Cli.CliOptions  @@ -51,6 +49,7 @@      groupUnnamed = [       flagNone ["declared"] (\opts -> setboolopt "declared" opts) "show account names declared with account directives"      ,flagNone ["used"] (\opts -> setboolopt "used" opts) "show account names referenced by transactions"+     ,flagNone ["codes"] (\opts -> setboolopt "codes" opts) "also show numeric account codes"      ,flagNone ["tree"] (\opts -> setboolopt "tree" opts) "show short account names, as a tree"      ,flagNone ["flat"] (\opts -> setboolopt "flat" opts) "show full account names, as a list (default)"      ,flagReq  ["drop"] (\s opts -> Right $ setopt "drop" s opts) "N" "flat mode: omit N leading account name parts"@@ -64,22 +63,39 @@ -- | The accounts command. accounts :: CliOpts -> Journal -> IO () accounts CliOpts{rawopts_=rawopts, reportopts_=ropts} j = do++  -- 1. identify the accounts we'll show   d <- getCurrentDay-  let q = queryFromOpts d ropts+  let tree     = tree_ ropts+      declared = boolopt "declared" rawopts+      used     = boolopt "used"     rawopts+      q        = queryFromOpts d ropts+      -- a depth limit will clip and exclude account names later, but should not exclude accounts at this stage       nodepthq = dbg1 "nodepthq" $ filterQuery (not . queryIsDepth) q       depth    = dbg1 "depth" $ queryDepth $ filterQuery queryIsDepth q-      matcheddeclaredaccts = dbg1 "matcheddeclaredaccts" $ nub $ sort $ filter (matchesAccount q) $ map fst $ jaccounts j-      matchedps = dbg1 "ps" $ journalPostings $ filterJournalPostings nodepthq j-      matchedusedaccts = dbg1 "matchedusedaccts" $ nub $ sort $ filter (not . T.null) $ map (clipAccountName depth) $ map paccount matchedps-      used     = boolopt "used"   rawopts-      declared = boolopt "declared" rawopts-      as | declared     && not used = matcheddeclaredaccts-         | not declared && used     = matchedusedaccts-         | otherwise                = nub $ sort $ matcheddeclaredaccts ++ matchedusedaccts-      as' | tree_ ropts = expandAccountNames as-          | otherwise   = as-      render a | tree_ ropts = T.replicate (2 * (accountNameLevel a - 1)) " " <> accountLeafName a-               | otherwise   = maybeAccountNameDrop ropts a-  mapM_ (putStrLn . T.unpack . render) as'+      matcheddeclaredaccts = dbg1 "matcheddeclaredaccts" $ filter (matchesAccount nodepthq) $ jdeclaredaccounts j+      matchedusedaccts     = dbg5 "matchedusedaccts" $ map paccount $ journalPostings $ filterJournalPostings nodepthq j+      accts                = dbg5 "accts to show" $ -- no need to nub/sort, accountTree will+        if | declared     && not used -> matcheddeclaredaccts+           | not declared && used     -> matchedusedaccts+           | otherwise                -> matcheddeclaredaccts ++ matchedusedaccts  -tests_Hledger_Cli_Commands_Accounts = TestList []+  -- 2. sort them by declaration order and name, at each level of their tree structure+      sortedaccts = sortAccountNamesByDeclaration j tree accts++  -- 3. if there's a depth limit, depth-clip and remove any no longer useful items +      clippedaccts =+        dbg1 "clippedaccts" $+        filter (matchesAccount q) $    -- clipping can leave accounts that no longer visibly match the query+        nub $                          -- clipping can leave duplicates (adjacent, hopefully)+        filter (not . T.null) $        -- depth:0 can leave nulls+        map (clipAccountName depth) $  -- clip at depth if specified +        sortedaccts ++  -- 4. print what remains as a list or tree, maybe applying --drop in the former case +  mapM_ (T.putStrLn . render) clippedaccts+    where+      render a +        | tree_ ropts = T.replicate (2 * (accountNameLevel a - 1)) " " <> accountLeafName a+        | otherwise   = maybeAccountNameDrop ropts a+
Hledger/Cli/Commands/Add.hs view
@@ -120,7 +120,7 @@ -- most similar recent transaction in the journal. getAndAddTransactions :: EntryState -> IO () getAndAddTransactions es@EntryState{..} = (do-  mt <- runInputT (setComplete noCompletion defaultSettings) (run $ haskeline $ confirmedTransactionWizard es)+  mt <- runInputT (setComplete noCompletion defaultSettings) (System.Console.Wizard.run $ haskeline $ confirmedTransactionWizard es)   case mt of     Nothing -> fail "urk ?"     Just t -> do
Hledger/Cli/Commands/Balance.hs view
@@ -247,10 +247,9 @@  ,multiBalanceReportHtmlRows  ,balanceReportAsTable  ,balanceReportTableAsText- ,tests_Hledger_Cli_Commands_Balance+ ,tests_Balance ) where -import Control.Monad (when) import Data.List import Data.Maybe --import qualified Data.Map as Map@@ -258,8 +257,6 @@ import qualified Data.Text.Lazy as TL import System.Console.CmdArgs.Explicit as C import Lucid as L-import Text.CSV-import Test.HUnit import Text.Printf (printf) import Text.Tabular as T --import Text.Tabular.AsciiWide@@ -267,6 +264,7 @@ import Hledger import Hledger.Cli.CliOptions import Hledger.Cli.Utils+import Hledger.Read.CsvReader (CSV, printCSV)   -- | Command line options for this command.@@ -314,7 +312,6 @@       case (budget, interval) of         (True, _) -> do           -- single or multicolumn budget report-          when (sort_amount_ ropts) $ error' "Sorry, --sort-amount is not yet supported with --budget."  -- TODO           reportspan <- reportSpan j ropts           let budgetreport     = dbg1 "budgetreport"     $ budgetReport ropts assrt showunbudgeted reportspan d j                 where@@ -395,21 +392,6 @@                 in overline : totallines                Left _ -> [] -tests_balanceReportAsText = [-  "balanceReportAsText" ~: do-  -- "unicode in balance layout" ~: do-    j <- readJournal'-      "2009/01/01 * медвежья шкура\n  расходы:покупки  100\n  актив:наличные\n"-    let opts = defreportopts-    balanceReportAsText opts (balanceReport opts (queryFromOpts (parsedate "2008/11/26") opts) j) `is`-      unlines-      ["                -100  актив:наличные"-      ,"                 100  расходы:покупки"-      ,"--------------------"-      ,"                   0"-      ]- ]- {- :r This implementation turned out to be a bit convoluted but implements the following algorithm for formatting:@@ -646,5 +628,19 @@             | otherwise    =  showMixedAmountOneLineWithoutPrice  -tests_Hledger_Cli_Commands_Balance = TestList-  tests_balanceReportAsText+tests_Balance = tests "Balance" [++   tests "balanceReportAsText" [+    test "unicode in balance layout" $ do+      j <- io $ readJournal' "2009/01/01 * медвежья шкура\n  расходы:покупки  100\n  актив:наличные\n"+      let opts = defreportopts+      balanceReportAsText opts (balanceReport opts (queryFromOpts (parsedate "2008/11/26") opts) j) `is`+        unlines+        ["                -100  актив:наличные"+        ,"                 100  расходы:покупки"+        ,"--------------------"+        ,"                   0"+        ]+  ]++ ]
Hledger/Cli/Commands/Balancesheet.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE QuasiQuotes, RecordWildCards, NoCPP #-}+{-# LANGUAGE QuasiQuotes, RecordWildCards #-} {-|  The @balancesheet@ command prints a simple balance sheet.@@ -8,12 +8,10 @@ module Hledger.Cli.Commands.Balancesheet (   balancesheetmode  ,balancesheet- ,tests_Hledger_Cli_Commands_Balancesheet ) where  import Data.String.Here import System.Console.CmdArgs.Explicit-import Test.HUnit  import Hledger import Hledger.Cli.CliOptions@@ -56,7 +54,3 @@ balancesheet :: CliOpts -> Journal -> IO () balancesheet = compoundBalanceCommand balancesheetSpec -tests_Hledger_Cli_Commands_Balancesheet :: Test-tests_Hledger_Cli_Commands_Balancesheet = TestList- [- ]
Hledger/Cli/Commands/Balancesheetequity.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE QuasiQuotes, RecordWildCards, NoCPP #-}+{-# LANGUAGE QuasiQuotes, RecordWildCards #-} {-|  The @balancesheetequity@ command prints a simple balance sheet.
Hledger/Cli/Commands/Cashflow.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE QuasiQuotes, RecordWildCards, NoCPP #-}+{-# LANGUAGE QuasiQuotes, RecordWildCards #-} {-|  The @cashflow@ command prints a simplified cashflow statement.  It just@@ -11,12 +11,10 @@ module Hledger.Cli.Commands.Cashflow (   cashflowmode  ,cashflow- ,tests_Hledger_Cli_Commands_Cashflow ) where  import Data.String.Here import System.Console.CmdArgs.Explicit-import Test.HUnit  import Hledger import Hledger.Cli.CliOptions@@ -52,8 +50,3 @@  cashflow :: CliOpts -> Journal -> IO () cashflow = compoundBalanceCommand cashflowSpec--tests_Hledger_Cli_Commands_Cashflow :: Test-tests_Hledger_Cli_Commands_Cashflow = TestList- [- ]
Hledger/Cli/Commands/Checkdates.hs view
@@ -1,16 +1,15 @@ {-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE NoOverloadedStrings #-} -- prevent trouble if turned on in ghci  module Hledger.Cli.Commands.Checkdates (   checkdatesmode  ,checkdates- ,tests_Hledger_Cli_Commands_Checkdates ) where  import Data.String.Here import Hledger import Hledger.Cli.CliOptions import System.Console.CmdArgs.Explicit-import Test.HUnit import Text.Printf  -- checkdatesmode :: Mode RawOpts@@ -78,8 +77,3 @@       if compare previous current       then acc{fa_previous=Just current}       else acc{fa_error=Just current}--tests_Hledger_Cli_Commands_Checkdates :: Test-tests_Hledger_Cli_Commands_Checkdates = TestList- [- ]
Hledger/Cli/Commands/Close.hs view
@@ -7,11 +7,13 @@ )  where +import Control.Monad (when) import Data.Maybe import Data.String.Here import Data.Time.Calendar import Hledger import Hledger.Cli.CliOptions+import System.Console.CmdArgs.Explicit as C  closemode = hledgerCommandMode   [here| close equity@@ -40,6 +42,9 @@ To close on some other date, use: `hledger close -e OPENINGDATE ...`. (-p or date: can also be used, the begin date is ignored.) +You can chose to print just one of the transactions with `--opening` +or `--closing`.+ For example, carrying asset/liability balances into a new file for 2018: ``` $ hledger close -f 2017.journal -e 2018/1/1 ^assets ^liab >>2017.journal@@ -58,14 +63,20 @@     assets:bank:checking  -1  ; date:2018/1/1 ```   |]-  []+  [flagNone ["opening"] (\opts -> setboolopt "opening" opts) "show just opening transaction"+  ,flagNone ["closing"] (\opts -> setboolopt "closing" opts) "show just closing transaction"+  ]   [generalflagsgroup1]   []   ([], Just $ argsFlag "[QUERY]") -close CliOpts{reportopts_=ropts} j = do+close CliOpts{rawopts_=rawopts, reportopts_=ropts} j = do   today <- getCurrentDay   let +      (opening, closing) = +        case (boolopt "opening" rawopts, boolopt "closing" rawopts) of+          (False, False) -> (True, True) -- by default show both opening and closing+          (o, c) -> (o, c)       ropts_ = ropts{balancetype_=HistoricalBalance, accountlistmode_=ALFlat}       q = queryFromOpts today ropts_       openingdate = fromMaybe today $ queryEndDate False q@@ -88,5 +99,6 @@             ,b <- amounts $ normaliseMixedAmountSquashPricesForDisplay mb             ]            ++ [posting{paccount="equity:closing balances", pamount=negate balancingamt}]-  putStr $ showTransaction (nulltransaction{tdate=closingdate, tdescription="closing balances", tpostings=nps})-  putStr $ showTransaction (nulltransaction{tdate=openingdate, tdescription="opening balances", tpostings=ps})+  when closing $ putStr $ showTransaction (nulltransaction{tdate=closingdate, tdescription="closing balances", tpostings=nps})+  when opening $ putStr $ showTransaction (nulltransaction{tdate=openingdate, tdescription="opening balances", tpostings=ps})+
+ Hledger/Cli/Commands/Files.hs view
@@ -0,0 +1,48 @@+{-|++The @files@ command lists included files.++-}++{-# LANGUAGE OverloadedStrings #-}++module Hledger.Cli.Commands.Files (+  filesmode+ ,files+) where++import Data.List+-- import Data.Text (Text)+import Safe+import System.Console.CmdArgs.Explicit as C++import Hledger+import Prelude hiding (putStrLn)+import Hledger.Utils.UTF8IOCompat (putStrLn)+import Hledger.Cli.CliOptions+++-- | Command line options for this command.+filesmode = (defCommandMode $ ["files"] ) {+  modeHelp = "show names of included files" + ,modeHelpSuffix = [+     "This command lists names of all files included in the parsed journal(s)." +    ,"With REGEX argument will list only files matching regular expression (case sensitive)."+   ]+ ,modeGroupFlags = C.Group {+     groupUnnamed = []+    ,groupHidden = []+    ,groupNamed = [generalflagsgroup2]+    }+ ,modeArgs=  ([], Just $ argsFlag "[REGEX]")+ }++-- | The files command.+files :: CliOpts -> Journal -> IO ()+files CliOpts{rawopts_=rawopts} j = do+  let args = listofstringopt "args" rawopts+      regex = headMay args+      files = (maybe id (filter . regexMatches) regex) +              $ map fst +              $ jfiles j+  mapM_ putStrLn files
Hledger/Cli/Commands/Incomestatement.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE QuasiQuotes, TemplateHaskell, OverloadedStrings, NoCPP #-}+{-# LANGUAGE QuasiQuotes, TemplateHaskell, OverloadedStrings #-} {-|  The @incomestatement@ command prints a simple income statement (profit & loss report).@@ -8,12 +8,10 @@ module Hledger.Cli.Commands.Incomestatement (   incomestatementmode  ,incomestatement- ,tests_Hledger_Cli_Commands_Incomestatement ) where  import Data.String.Here import System.Console.CmdArgs.Explicit-import Test.HUnit  import Hledger import Hledger.Cli.CliOptions@@ -55,8 +53,3 @@  incomestatement :: CliOpts -> Journal -> IO () incomestatement = compoundBalanceCommand incomestatementSpec--tests_Hledger_Cli_Commands_Incomestatement :: Test-tests_Hledger_Cli_Commands_Incomestatement = TestList- [- ]
Hledger/Cli/Commands/Prices.hs view
@@ -17,28 +17,34 @@  pricesmode = hledgerCommandMode   [here| prices-Print all market prices from the journal.+Print market price directives from the journal.+With --costs, also print synthetic market prices based on transaction prices.+With --inverted-costs, also print inverse prices based on transaction prices.+Prices (and postings providing prices) can be filtered by a query.   |]   [flagNone ["costs"] (setboolopt "costs") "print transaction prices from postings"   ,flagNone ["inverted-costs"] (setboolopt "inverted-costs") "print transaction inverted prices from postings also"]   [generalflagsgroup1]   []-  ([], Nothing)+  ([], Just $ argsFlag "[QUERY]") +-- XXX the original hledger-prices script always ignored assertions  prices opts j = do-  -- XXX the original hledger-prices script always ignored assertions -  let cprices = concatMap postingCosts . allPostings $ j-      icprices = concatMap postingCosts . mapAmount invertPrice . allPostings $ j-      printPrices = mapM_ (putStrLn . showPrice)-      forBoolOpt opt | boolopt opt $ rawopts_ opts = id-                     | otherwise = const []-      allPrices = sortOn mpdate . concat $-          [ jmarketprices j-          , forBoolOpt "costs" cprices-          , forBoolOpt "inverted-costs" icprices-          ]-  -  printPrices allPrices+  d <- getCurrentDay+  let+    q          = queryFromOpts d (reportopts_ opts)+    ps         = filter (matchesPosting q) $ allPostings j+    mprices    = jmarketprices j+    cprices    = concatMap postingCosts ps+    icprices   = concatMap postingCosts . mapAmount invertPrice $ ps+    allprices  = mprices ++ ifBoolOpt "costs" cprices ++ ifBoolOpt "inverted-costs" icprices+  mapM_ (putStrLn . showPrice) $+    sortOn mpdate $+    filter (matchesMarketPrice q) $+    allprices+  where+    ifBoolOpt opt | boolopt opt $ rawopts_ opts = id+                  | otherwise = const []  showPrice :: MarketPrice -> String showPrice mp = unwords ["P", show $ mpdate mp, T.unpack . quoteCommoditySymbolIfNeeded $ mpcommodity mp, showAmountWithZeroCommodity $ mpamount mp]
Hledger/Cli/Commands/Print.hs view
@@ -11,15 +11,13 @@  ,print'  -- ,entriesReportAsText  ,originalTransaction- ,tests_Hledger_Cli_Commands_Print ) where  import Data.Text (Text) import qualified Data.Text as T import System.Console.CmdArgs.Explicit-import Test.HUnit-import Text.CSV+import Hledger.Read.CsvReader (CSV, printCSV)  import Hledger import Hledger.Cli.CliOptions@@ -181,8 +179,3 @@       | otherwise           = Just $ snd $ head historymatches       where         historymatches = transactionsSimilarTo j q desc---- tests--tests_Hledger_Cli_Commands_Print = TestList []-  -- tests_showTransactions
Hledger/Cli/Commands/Register.hs view
@@ -12,7 +12,7 @@  ,postingsReportAsText  ,postingsReportItemAsText  -- ,showPostingWithBalanceForVty- ,tests_Hledger_Cli_Commands_Register+ ,tests_Register ) where  import Data.List@@ -20,14 +20,12 @@ -- import Data.Text (Text) import qualified Data.Text as T import System.Console.CmdArgs.Explicit-import Text.CSV-import Test.HUnit+import Hledger.Read.CsvReader (CSV, Record, printCSV)  import Hledger import Hledger.Cli.CliOptions import Hledger.Cli.Utils - registermode = (defCommandMode $ ["register"] ++ aliases) {   modeHelp = "show postings and running total. With --date2, show and sort by secondary date instead." `withAliases` aliases  ,modeGroupFlags = Group {@@ -97,17 +95,6 @@     itemamt (_,_,_,Posting{pamount=a},_) = a     itembal (_,_,_,_,a) = a -tests_postingsReportAsText = [-  "postingsReportAsText" ~: do-  -- "unicode in register layout" ~: do-    j <- readJournal'-      "2009/01/01 * медвежья шкура\n  расходы:покупки  100\n  актив:наличные\n"-    let opts = defreportopts-    (postingsReportAsText defcliopts $ postingsReport opts (queryFromOpts (parsedate "2008/11/26") opts) j) `is` unlines-      ["2009/01/01 медвежья шкура       расходы:покупки                100           100"-      ,"                                актив:наличные                -100             0"]- ]- -- | Render one register report line item as plain text. Layout is like so: -- @ -- <---------------- width (specified, terminal width, or 80) -------------------->@@ -201,6 +188,17 @@       (balfirstline:balrest) = take numlines $ replicate (numlines - ballen) "" ++ ballines -- balance amount is bottom-aligned       spacer = replicate (totalwidth - (amtwidth + 2 + balwidth)) ' ' -tests_Hledger_Cli_Commands_Register :: Test-tests_Hledger_Cli_Commands_Register = TestList-  tests_postingsReportAsText+-- tests++tests_Register = tests "Register" [++   tests "postingsReportAsText" [+    test "unicode in register layout" $ do+      j <- io $ readJournal' "2009/01/01 * медвежья шкура\n  расходы:покупки  100\n  актив:наличные\n"+      let opts = defreportopts+      (postingsReportAsText defcliopts $ postingsReport opts (queryFromOpts (parsedate "2008/11/26") opts) j) `is` unlines+        ["2009/01/01 медвежья шкура       расходы:покупки                100           100"+        ,"                                актив:наличные                -100             0"]+   ]++ ]
Hledger/Cli/Commands/Rewrite.hs view
@@ -10,6 +10,7 @@ #if !(MIN_VERSION_base(4,11,0)) import Control.Monad.Writer #endif+import Data.Functor.Identity import Data.List (sortOn, foldl') import Data.String.Here import qualified Data.Text as T@@ -23,7 +24,8 @@  rewritemode = hledgerCommandMode   [here| rewrite-Print all transactions, adding custom postings to the matched ones.+Print all transactions, rewriting the postings of matched transactions.+For now the only rewrite available is adding new postings, like print --auto.  FLAGS @@ -146,6 +148,20 @@  https://github.com/simonmichael/hledger/issues/99 +#### rewrite vs. print --auto++This command predates print --auto, and currently does much the same thing,+but with these differences:++- with multiple files, rewrite lets rules in any file affect all other files.+  print --auto uses standard directive scoping; rules affect only child files.++- rewrite's query limits which transactions can be rewritten; all are printed.+  print --auto's query limits which transactions are printed.++- rewrite applies rules specified on command line or in the journal.+  print --auto applies rules specified in the journal.+   |]   [flagReq ["add-posting"] (\s opts -> Right $ setopt "add-posting" s opts) "'ACCT  AMTEXPR'"            "add a posting to ACCT, which may be parenthesised. AMTEXPR is either a literal amount, or *N which means the transaction's first matched amount multiplied by N (a decimal number). Two spaces separate ACCT and AMTEXPR."@@ -161,33 +177,29 @@ -- TODO allow using this on unbalanced entries, eg to rewrite while editing  rewrite opts@CliOpts{rawopts_=rawopts,reportopts_=ropts} j@Journal{jtxns=ts} = do -  d <- getCurrentDay-  let q = queryFromOpts d ropts-  modifier <- modifierTransactionFromOpts rawopts   -- create re-writer-  let modifiers = modifier : jmodifiertxns j-      -- Note that some query matches require transaction. Thus modifiers-      -- pipeline should include txnTieKnot on every step.-      modifier' = foldr (flip (.) . fmap txnTieKnot . runModifierTransaction q) id modifiers+  let modifiers = transactionModifierFromOpts opts : jtxnmodifiers j+      applyallmodifiers = foldr (flip (.) . transactionModifierToFunction) id modifiers   -- rewrite matched transactions-  let j' = j{jtxns=map modifier' ts}-  -- run the print command, showing all transactions-  outputFromOpts rawopts opts{reportopts_=ropts{query_=""}} j j'--postingp' :: T.Text -> IO Posting-postingp' t = runJournalParser (postingp Nothing <* eof) t' >>= \case-        Left err -> fail $ parseErrorPretty' t' err-        Right p -> return p-    where t' = " " <> t <> "\n" -- inject space and newline for proper parsing+  let j' = j{jtxns=map applyallmodifiers ts}+  -- run the print command, showing all transactions, or show diffs+  printOrDiff rawopts opts{reportopts_=ropts{query_=""}} j j' -modifierTransactionFromOpts :: RawOpts -> IO ModifierTransaction-modifierTransactionFromOpts opts = do-    postings <- mapM (postingp' . stripquotes . T.pack) $ listofstringopt "add-posting" opts-    return-        ModifierTransaction { mtvalueexpr = T.empty, mtpostings = postings }+-- | Build a 'TransactionModifier' from any query arguments and --add-posting flags+-- provided on the command line, or throw a parse error.+transactionModifierFromOpts :: CliOpts -> TransactionModifier+transactionModifierFromOpts CliOpts{rawopts_=rawopts,reportopts_=ropts} = +  TransactionModifier{tmquerytxt=q, tmpostings=ps}+  where+    q = T.pack $ query_ ropts+    ps = map (parseposting . stripquotes . T.pack) $ listofstringopt "add-posting" rawopts+    parseposting t = either (error' . parseErrorPretty' t') id ep +      where+        ep = runIdentity (runJournalParser (postingp Nothing <* eof) t')+        t' = " " <> t <> "\n" -- inject space and newline for proper parsing -outputFromOpts :: RawOpts -> (CliOpts -> Journal -> Journal -> IO ())-outputFromOpts opts+printOrDiff :: RawOpts -> (CliOpts -> Journal -> Journal -> IO ())+printOrDiff opts     | boolopt "diff" opts = const diffOutput     | otherwise = flip (const print') @@ -198,8 +210,7 @@  type Chunk = (GenericSourcePos, [DiffLine String]) --- | Render list of changed lines as a unified diff---+-- XXX doctests, update needed: -- >>> putStr $ renderPatch [(GenericSourcePos "a" 1 1, [D.First "x", D.Second "y"])] -- --- a -- +++ a@@ -224,6 +235,7 @@ -- +++ b -- @@ -5,0 +5,1 @@ -- +z+-- | Render list of changed lines as a unified diff renderPatch :: [Chunk] -> String renderPatch = go Nothing . sortOn fst where     go _ [] = ""
+ Hledger/Cli/Commands/Roi.hs view
@@ -0,0 +1,244 @@+{-# LANGUAGE QuasiQuotes,ParallelListComp #-}+{-|++The @roi@ command prints internal rate of return and time-weighted rate of return for and investment.++-}++module Hledger.Cli.Commands.Roi ( +  roimode+  , roi+) where++import Control.Monad+import System.Exit+import Data.Time.Calendar+import Text.Printf+import Data.Function (on)+import Data.List+import Data.Ord+import Statistics.Math.RootFinding+import Data.Decimal+import Data.String.Here+import System.Console.CmdArgs.Explicit as CmdArgs++import Text.Tabular as Tbl+import Text.Tabular.AsciiWide as Ascii++import Hledger+import Hledger.Cli.CliOptions+++roimode = (defCommandMode $ ["roi"]) {+  modeHelp = "shows return on investment for your portfolio."+  ,modeHelpSuffix=lines [here|+This command will show you time-weighted (TWR) and money-weighted (IRR) rate of return on your investments.++Command assumes that you have account(s) that hold nothing but your investments and whenever you record current appraisal/valuation of these investments you offset unrealized profit and loss into account(s) that, again, hold nothing but unrealized profit and loss.++Any transactions affecting balance of investment account(s) and not originating from unrealized profit and loss account(s) are assumed to be your investments or withdrawals.++At a minimum, you need to supply query (which could be just an account name) to select your investments with `--inv`, and another query to identify your profit and loss transactions with `--pnl`.++Command will compute and display internalized rate of return (IRR) and time-weighted rate of return (TWR) for your investments for the time period requested. Both rates of return are annualized before display, regardless of the length of reporting interval.+|]+  ,modeGroupFlags = CmdArgs.Group {+    groupUnnamed = [+       flagNone ["cashflow"] (setboolopt "cashflow") "show all amounts that were used to compute returns"+       , flagReq ["investment"] (\s opts -> Right $ setopt "investment" s opts) "QUERY"+         "query to select your investment transactions"+       , flagReq ["profit-loss","pnl"] (\s opts -> Right $ setopt "pnl" s opts) "QUERY"+         "query to select profit-and-loss or appreciation/valuation transactions"+       ]+    , groupHidden = []+    ,groupNamed = [generalflagsgroup1]+    }+  }++-- One reporting span, +data OneSpan = OneSpan +  Day -- start date, inclusive+  Day   -- end date, exclusive+  Quantity -- value of investment at the beginning of day on spanBegin_+  Quantity  -- value of investment at the end of day on spanEnd_+  [(Day,Quantity)] -- all deposits and withdrawals (but not changes of value) in the DateSpan [spanBegin_,spanEnd_)+ deriving (Show)+  ++roi ::  CliOpts -> Journal -> IO ()+roi CliOpts{rawopts_=rawopts, reportopts_=ropts} j = do+  d <- getCurrentDay+  let +    investmentsQuery = queryFromOpts d $ ropts{query_ = stringopt "investment" rawopts,period_=PeriodAll}+    pnlQuery         = queryFromOpts d $ ropts{query_ = stringopt "pnl" rawopts,period_=PeriodAll}+    showCashFlow      = boolopt "cashflow" rawopts+    prettyTables     = pretty_tables_ ropts+    +    trans = dbg3 "investments" $ jtxns $ filterJournalTransactions investmentsQuery j+  +    journalSpan = +        let dates = map transactionDate2 trans in +        DateSpan (Just $ minimum dates) (Just $ addDays 1 $ maximum dates)            +        +    requestedSpan = periodAsDateSpan $ period_ ropts+    requestedInterval = interval_ ropts+    +    wholeSpan = spanDefaultsFrom requestedSpan journalSpan ++  when (null trans) $ do+    putStrLn "No relevant transactions found. Check your investments query"+    exitFailure+  +  let spans = case requestedInterval of+        NoInterval -> [wholeSpan]+        interval ->+            splitSpan interval $+            spanIntersect journalSpan wholeSpan++  tableBody <- (flip mapM) spans $ \(DateSpan (Just spanBegin) (Just spanEnd)) -> do+    -- Spans are [spanBegin,spanEnd), and spanEnd is 1 day after then actual end date we are interested in+    let +      valueBefore =+        total trans (And [ investmentsQuery+                         , Date (DateSpan Nothing (Just spanBegin))])+    +      valueAfter  = +        total trans (And [investmentsQuery+                         , Date (DateSpan Nothing (Just spanEnd))])+        +      cashFlow = +        calculateCashFlow trans (And [ Not investmentsQuery+                                     , Not pnlQuery+                                     , Date (DateSpan (Just spanBegin) (Just spanEnd)) ] )+      +      thisSpan = dbg3 "processing span" $ +                 OneSpan spanBegin spanEnd valueBefore valueAfter cashFlow+      +    irr <- internalRateOfReturn showCashFlow prettyTables thisSpan+    twr <- timeWeightedReturn showCashFlow prettyTables investmentsQuery trans thisSpan+    let cashFlowAmt = negate $ sum $ map snd cashFlow+    return [ showDate spanBegin+           , showDate (addDays (-1) spanEnd)+           , show valueBefore+           , show cashFlowAmt+           , show valueAfter+           , show (valueAfter - (valueBefore + cashFlowAmt))+           , printf "%0.2f%%" irr+           , printf "%0.2f%%" twr ]++  let table = Table +              (Tbl.Group NoLine (map (Header . show) (take (length tableBody) [1..]))) +              (Tbl.Group DoubleLine +               [ Tbl.Group SingleLine [Header "Begin", Header "End"]+               , Tbl.Group SingleLine [Header "Value (begin)", Header "Cashflow", Header "Value (end)", Header "PnL"]+               , Tbl.Group SingleLine [Header "IRR", Header "TWR"]])+              tableBody+  +  putStrLn $ Ascii.render prettyTables id id id table++timeWeightedReturn showCashFlow prettyTables investmentsQuery trans (OneSpan spanBegin spanEnd valueBefore valueAfter cashFlow) = do+  let initialUnitPrice = 100+  let initialUnits = valueBefore / initialUnitPrice+  let cashflow = +        -- Aggregate all entries for a single day, assuming that intraday interest is negligible+        map (\date_cash -> let (dates, cash) = unzip date_cash in (head dates, sum cash))+        $ groupBy ((==) `on` fst)+        $ sortBy (comparing fst) +        $ map (\(d,a) -> (d, negate a)) +        $ filter ((/=0).snd) cashFlow+    +  let units = +        tail $+        (flip scanl) +        (0,0,0,initialUnits)+        (\(_,_,_,unitBalance) (date, amt) -> +          let valueOnDate = +                total trans (And [investmentsQuery, Date (DateSpan Nothing (Just date))])+              unitPrice = if unitBalance == 0.0 then initialUnitPrice else valueOnDate / unitBalance+              unitsBoughtOrSold = amt / unitPrice+          in+           (valueOnDate, unitsBoughtOrSold, unitPrice, unitBalance + unitsBoughtOrSold)+        )  +        cashflow+  +  let finalUnitBalance = if null units then initialUnits else let (_,_,_,u) = last units in u+      finalUnitPrice = valueAfter / finalUnitBalance+      totalTWR = roundTo 2 $ (finalUnitPrice - initialUnitPrice)+      years = (fromIntegral $ diffDays spanEnd spanBegin)/365 :: Double+      annualizedTWR = 100*((1+(realToFrac totalTWR/100))**(1/years)-1) :: Double+        +  let s d = show $ roundTo 2 d +  when showCashFlow $ do+    printf "\nTWR cash flow for %s - %s\n" (showDate spanBegin) (showDate (addDays (-1) spanEnd))+    let (dates', amounts') = unzip cashflow+        (valuesOnDate',unitsBoughtOrSold', unitPrices', unitBalances') = unzip4 units+        add x lst = if valueBefore/=0 then x:lst else lst+        dates = add spanBegin dates'+        amounts = add valueBefore amounts'+        unitsBoughtOrSold = add initialUnits unitsBoughtOrSold'+        unitPrices = add initialUnitPrice unitPrices'+        unitBalances = add initialUnits unitBalances'+        valuesOnDate = add 0 valuesOnDate'+        +    putStr $ Ascii.render prettyTables id id id +      (Table +       (Tbl.Group NoLine (map (Header . showDate) dates))+       (Tbl.Group DoubleLine [ Tbl.Group SingleLine [Header "Portfolio value", Header "Unit balance"] +                         , Tbl.Group SingleLine [Header "Cash", Header "Unit price", Header "Units"]+                         , Tbl.Group SingleLine [Header "New Unit Balance"]])+       [ [value, oldBalance, amt, prc, udelta, balance] +       | value <- map s valuesOnDate+       | oldBalance <- map s (0:unitBalances)+       | balance <- map s unitBalances+       | amt <- map s amounts+       | prc <- map s unitPrices+       | udelta <- map s unitsBoughtOrSold ])+  +    printf "Final unit price: %s/%s=%s U.\nTotal TWR: %s%%.\nPeriod: %.2f years.\nAnnualized TWR: %.2f%%\n\n" (s valueAfter) (s finalUnitBalance) (s finalUnitPrice) (s totalTWR) years annualizedTWR+  +  return annualizedTWR+  ++internalRateOfReturn showCashFlow prettyTables (OneSpan spanBegin spanEnd valueBefore valueAfter cashFlow) = do +  let prefix = (spanBegin, negate valueBefore)++      postfix = (spanEnd, valueAfter)++      totalCF = filter ((/=0) . snd) $ prefix : (sortBy (comparing fst) cashFlow) ++ [postfix]++  when showCashFlow $ do+    printf "\nIRR cash flow for %s - %s\n" (showDate spanBegin) (showDate (addDays (-1) spanEnd)) +    let (dates, amounts) = unzip totalCF+    putStrLn $ Ascii.render prettyTables id id id +      (Table +       (Tbl.Group NoLine (map (Header . showDate) dates))+       (Tbl.Group SingleLine [Header "Amount"])+       (map ((:[]) . show) amounts))+                             +  -- 0% is always a solution, so require at least something here+  case ridders 0.00001 (0.000000000001,10000) (interestSum spanEnd totalCF) of+    Root rate -> return ((rate-1)*100)+    NotBracketed -> error "Error: No solution -- not bracketed."+    SearchFailed -> error "Error: Failed to find solution."++type CashFlow = [(Day, Quantity)]++interestSum :: Day -> CashFlow -> Double -> Double+interestSum referenceDay cf rate = sum $ map go cf+    where go (t,m) = (fromRational $ toRational m) * (rate ** (fromIntegral (referenceDay `diffDays` t) / 365))+++calculateCashFlow :: [Transaction] -> Query -> CashFlow+calculateCashFlow trans query = map go trans+    where+    go t = (transactionDate2 t, total [t] query)++total :: [Transaction] -> Query -> Quantity+total trans query = unMix $ sumPostings $ filter (matchesPosting query) $ concatMap realPostings trans+    +unMix :: MixedAmount -> Quantity   +unMix a = +  case (normaliseMixedAmount $ costOfMixedAmount a) of+    (Mixed [a]) -> aquantity a+    _ -> error "MixedAmount failed to normalize"+
Hledger/Cli/CompoundBalanceCommand.hs view
@@ -18,7 +18,7 @@ import qualified Data.Text as TS import qualified Data.Text.Lazy as TL import System.Console.CmdArgs.Explicit as C-import Text.CSV+import Hledger.Read.CsvReader (CSV, printCSV) import Lucid as L import Text.Tabular as T 
Hledger/Cli/DocFiles.hs view
@@ -22,6 +22,8 @@  import Prelude () import "base-compat-batteries" Prelude.Compat+import Data.ByteString (ByteString)+import qualified Data.ByteString.Char8 as BC import Data.FileEmbed import Data.String import System.IO@@ -32,82 +34,82 @@  type Topic = String -docFiles :: IsString a => [(Topic, (a, a, a))]+docFiles :: [(Topic, (ByteString, ByteString, ByteString))] docFiles = [    ("hledger",-    ($(makeRelativeToProject "embeddedfiles/hledger.1" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger.txt" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger.info" >>= embedStringFile)+    ($(makeRelativeToProject "embeddedfiles/hledger.1" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger.txt" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger.info" >>= embedFile)     ))   ,("hledger-ui",-    ($(makeRelativeToProject "embeddedfiles/hledger-ui.1" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger-ui.txt" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger-ui.info" >>= embedStringFile)+    ($(makeRelativeToProject "embeddedfiles/hledger-ui.1" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger-ui.txt" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger-ui.info" >>= embedFile)     ))   ,("hledger-web",-    ($(makeRelativeToProject "embeddedfiles/hledger-web.1" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger-web.txt" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger-web.info" >>= embedStringFile)+    ($(makeRelativeToProject "embeddedfiles/hledger-web.1" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger-web.txt" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger-web.info" >>= embedFile)     ))   ,("hledger-api",-    ($(makeRelativeToProject "embeddedfiles/hledger-api.1" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger-api.txt" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger-api.info" >>= embedStringFile)+    ($(makeRelativeToProject "embeddedfiles/hledger-api.1" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger-api.txt" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger-api.info" >>= embedFile)     ))   ,("journal",-    ($(makeRelativeToProject "embeddedfiles/hledger_journal.5" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger_journal.txt" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger_journal.info" >>= embedStringFile)+    ($(makeRelativeToProject "embeddedfiles/hledger_journal.5" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger_journal.txt" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger_journal.info" >>= embedFile)     ))   ,("csv",-    ($(makeRelativeToProject "embeddedfiles/hledger_csv.5" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger_csv.txt" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger_csv.info" >>= embedStringFile)+    ($(makeRelativeToProject "embeddedfiles/hledger_csv.5" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger_csv.txt" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger_csv.info" >>= embedFile)     ))   ,("timeclock",-    ($(makeRelativeToProject "embeddedfiles/hledger_timeclock.5" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger_timeclock.txt" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger_timeclock.info" >>= embedStringFile)+    ($(makeRelativeToProject "embeddedfiles/hledger_timeclock.5" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger_timeclock.txt" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger_timeclock.info" >>= embedFile)     ))   ,("timedot",-    ($(makeRelativeToProject "embeddedfiles/hledger_timedot.5" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger_timedot.txt" >>= embedStringFile)-    ,$(makeRelativeToProject "embeddedfiles/hledger_timedot.info" >>= embedStringFile)+    ($(makeRelativeToProject "embeddedfiles/hledger_timedot.5" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger_timedot.txt" >>= embedFile)+    ,$(makeRelativeToProject "embeddedfiles/hledger_timedot.info" >>= embedFile)     ))   ]  docTopics :: [Topic] docTopics = map fst docFiles -lookupDocTxt :: IsString a => Topic -> a+lookupDocTxt :: Topic -> ByteString lookupDocTxt name =   maybe (fromString $ "No text manual found for topic: "++name) second3 $ lookup name docFiles -lookupDocNroff :: IsString a => Topic -> a+lookupDocNroff :: Topic -> ByteString lookupDocNroff name =   maybe (fromString $ "No man page found for topic: "++name) first3 $ lookup name docFiles -lookupDocInfo :: IsString a => Topic -> a+lookupDocInfo :: Topic -> ByteString lookupDocInfo name =   maybe (fromString $ "No info manual found for topic: "++name) third3 $ lookup name docFiles  printHelpForTopic :: Topic -> IO () printHelpForTopic t =-  putStrLn $ lookupDocTxt t+  BC.putStr (lookupDocTxt t)  runPagerForTopic :: FilePath -> Topic -> IO () runPagerForTopic exe t = do   (Just inp, _, _, ph) <- createProcess (proc exe []){     std_in=CreatePipe     }-  hPutStrLn inp (lookupDocTxt t)+  BC.hPutStrLn inp (lookupDocTxt t)   _ <- waitForProcess ph   return ()  runManForTopic :: Topic -> IO () runManForTopic t =   withSystemTempFile ("hledger-"++t++".nroff") $ \f h -> do-    hPutStrLn h $ lookupDocNroff t+    BC.hPutStrLn h $ lookupDocNroff t     hClose h      -- the temp file path will presumably have a slash in it, so man should read it     callCommand $ "man " ++ f@@ -115,7 +117,7 @@ runInfoForTopic :: Topic -> IO () runInfoForTopic t =   withSystemTempFile ("hledger-"++t++".info") $ \f h -> do-    hPutStrLn h $ lookupDocInfo t+    BC.hPutStrLn h $ lookupDocInfo t     hClose h     callCommand $ "info " ++ f 
Hledger/Cli/Main.hs view
@@ -115,7 +115,7 @@     (argsbeforecmd, argsaftercmd') = break (==rawcmd) args     argsaftercmd         = drop 1 argsaftercmd'     dbgIO :: Show a => String -> a -> IO ()-    dbgIO = tracePrettyAtIO 2+    dbgIO = ptraceAtIO 2    dbgIO "running" prognameandversion   dbgIO "raw args" args@@ -169,14 +169,17 @@       | isBadCommand             = badCommandError        -- builtin commands-      | Just (cmdmode, cmdaction) <- findCommand cmd = do -        if cmd=="add" -- add command does extra work before reading journal-        then (do-          journalFilePathFromOpts opts >>= (ensureJournalFileExists . head) -          withJournalDo opts cmdaction)-          `orShowHelp` cmdmode-        else-          withJournalDo opts cmdaction `orShowHelp` cmdmode+      | Just (cmdmode, cmdaction) <- findCommand cmd =+        (case cmd of+          "test" -> -- should not read the journal+            cmdaction opts (error "journal-less command tried to use the journal")+          "add" ->  -- should create the journal if missing+            (ensureJournalFileExists =<< (head <$> journalFilePathFromOpts opts)) >>+            withJournalDo opts cmdaction+          _ ->      -- all other commands: read the journal or fail if missing+            withJournalDo opts cmdaction+        )+        `orShowHelp` cmdmode        -- addon commands       | isExternalCommand = do@@ -225,16 +228,21 @@        (bs,"--debug":[])                                   -> bs++"--debug=1":[]        _                                                   -> as -    -- -h ..., --version ...-    moveArgs (f:a:as)   | isMovableNoArgFlag f                   = (moveArgs $ a:as) ++ [f]-    -- -f FILE ..., --alias ALIAS ...-    moveArgs (f:v:a:as) | isMovableReqArgFlag f, isValue v       = (moveArgs $ a:as) ++ [f,v]-    -- -fFILE ..., --alias=ALIAS ...-    moveArgs (fv:a:as)  | isMovableReqArgFlagAndValue fv         = (moveArgs $ a:as) ++ [fv]-    -- -f(missing arg)-    moveArgs (f:a:as)   | isMovableReqArgFlag f, not (isValue a) = (moveArgs $ a:as) ++ [f]-    -- anything else-    moveArgs as = as+    moveArgs args = insertFlagsAfterCommand $ moveArgs' (args, [])+      where+        -- -h ..., --version ...+        moveArgs' ((f:a:as), flags)   | isMovableNoArgFlag f                   = moveArgs' (a:as, flags ++ [f])+        -- -f FILE ..., --alias ALIAS ...+        moveArgs' ((f:v:a:as), flags) | isMovableReqArgFlag f, isValue v       = moveArgs' (a:as, flags ++ [f,v])+        -- -fFILE ..., --alias=ALIAS ...+        moveArgs' ((fv:a:as), flags)  | isMovableReqArgFlagAndValue fv         = moveArgs' (a:as, flags ++ [fv])+        -- -f(missing arg)+        moveArgs' ((f:a:as), flags)   | isMovableReqArgFlag f, not (isValue a) = moveArgs' (a:as, flags ++ [f])+        -- anything else+        moveArgs' (as, flags) = (as, flags)++        insertFlagsAfterCommand ([],           flags) = flags+        insertFlagsAfterCommand (command:args, flags) = [command] ++ flags ++ args  isMovableNoArgFlag a  = "-" `isPrefixOf` a && dropWhile (=='-') a `elem` noargflagstomove 
Hledger/Cli/Utils.hs view
@@ -1,4 +1,5 @@-{-# LANGUAGE ScopedTypeVariables, CPP #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE NoOverloadedStrings #-} -- prevent trouble if turned on in ghci {-|  Utilities for top-level modules and ghci. See also Hledger.Read and@@ -13,7 +14,6 @@      journalTransform,      journalApplyValue,      journalAddForecast,-     generateAutomaticPostings,      journalReload,      journalReloadIfChanged,      journalFileIsNewer,@@ -25,7 +25,6 @@      readFileStrictly,      pivotByOpts,      anonymiseByOpts,-     Test(TestList),     ) where import Control.Exception as C@@ -47,7 +46,6 @@ import System.Info (os) import System.Process (readProcessWithExitCode) import System.Time (ClockTime, getClockTime, diffClockTimes, TimeDiff(TimeDiff))-import Test.HUnit import Text.Printf import Text.Regex.TDFA ((=~)) 
embeddedfiles/hledger-api.1 view
@@ -1,5 +1,5 @@ -.TH "hledger\-api" "1" "June 2018" "hledger\-api 1.9.99" "hledger User Manuals"+.TH "hledger\-api" "1" "September 2018" "hledger\-api 1.10.99" "hledger User Manuals"   
embeddedfiles/hledger-api.info view
@@ -3,8 +3,8 @@  File: hledger-api.info,  Node: Top,  Next: OPTIONS,  Up: (dir) -hledger-api(1) hledger-api 1.9.99-*********************************+hledger-api(1) hledger-api 1.10.99+**********************************  hledger-api is a simple web API server, intended to support client-side web apps operating on hledger data.  It comes with a series of simple@@ -80,7 +80,7 @@  Tag Table: Node: Top72-Node: OPTIONS1664-Ref: #options1749+Node: OPTIONS1666+Ref: #options1751  End Tag Table
embeddedfiles/hledger-api.txt view
@@ -117,4 +117,4 @@   -hledger-api 1.9.99                 June 2018                    hledger-api(1)+hledger-api 1.10.99             September 2018                  hledger-api(1)
embeddedfiles/hledger-ui.1 view
@@ -1,5 +1,5 @@ -.TH "hledger\-ui" "1" "June 2018" "hledger\-ui 1.9.99" "hledger User Manuals"+.TH "hledger\-ui" "1" "September 2018" "hledger\-ui 1.10.99" "hledger User Manuals"   @@ -75,6 +75,11 @@ .TP .B \f[C]\-\-rules\-file=RULESFILE\f[] Conversion rules file to use when reading CSV (default: FILE.rules)+.RS+.RE+.TP+.B \f[C]\-\-separator=CHAR\f[]+Field separator to expect when reading CSV (default: `,') .RS .RE .TP
embeddedfiles/hledger-ui.info view
@@ -3,8 +3,8 @@  File: hledger-ui.info,  Node: Top,  Next: OPTIONS,  Up: (dir) -hledger-ui(1) hledger-ui 1.9.99-*******************************+hledger-ui(1) hledger-ui 1.10.99+********************************  hledger-ui is hledger's curses-style interface, providing an efficient full-window text UI for viewing accounts and transactions, and some@@ -61,6 +61,9 @@ '--rules-file=RULESFILE'       Conversion rules file to use when reading CSV (default: FILE.rules)+'--separator=CHAR'++     Field separator to expect when reading CSV (default: ',') '--alias=OLD=NEW'       rename accounts named OLD to NEW@@ -377,19 +380,19 @@  Tag Table: Node: Top71-Node: OPTIONS827-Ref: #options924-Node: KEYS4141-Ref: #keys4236-Node: SCREENS7195-Ref: #screens7280-Node: Accounts screen7370-Ref: #accounts-screen7498-Node: Register screen9728-Ref: #register-screen9883-Node: Transaction screen11957-Ref: #transaction-screen12115-Node: Error screen12985-Ref: #error-screen13107+Node: OPTIONS829+Ref: #options926+Node: KEYS4226+Ref: #keys4321+Node: SCREENS7280+Ref: #screens7365+Node: Accounts screen7455+Ref: #accounts-screen7583+Node: Register screen9813+Ref: #register-screen9968+Node: Transaction screen12042+Ref: #transaction-screen12200+Node: Error screen13070+Ref: #error-screen13192  End Tag Table
embeddedfiles/hledger-ui.txt view
@@ -60,6 +60,9 @@               Conversion  rules  file  to  use  when  reading  CSV   (default:               FILE.rules) +       --separator=CHAR+              Field separator to expect when reading CSV (default: `,')+        --alias=OLD=NEW               rename accounts named OLD to NEW @@ -384,4 +387,4 @@   -hledger-ui 1.9.99                  June 2018                     hledger-ui(1)+hledger-ui 1.10.99              September 2018                   hledger-ui(1)
embeddedfiles/hledger-web.1 view
@@ -1,5 +1,5 @@ -.TH "hledger\-web" "1" "June 2018" "hledger\-web 1.9.99" "hledger User Manuals"+.TH "hledger\-web" "1" "September 2018" "hledger\-web 1.10.99" "hledger User Manuals"   @@ -130,6 +130,11 @@ .TP .B \f[C]\-\-rules\-file=RULESFILE\f[] Conversion rules file to use when reading CSV (default: FILE.rules)+.RS+.RE+.TP+.B \f[C]\-\-separator=CHAR\f[]+Field separator to expect when reading CSV (default: `,') .RS .RE .TP
embeddedfiles/hledger-web.info view
@@ -3,8 +3,8 @@  File: hledger-web.info,  Node: Top,  Next: OPTIONS,  Up: (dir) -hledger-web(1) hledger-web 1.9.99-*********************************+hledger-web(1) hledger-web 1.10.99+**********************************  hledger-web is hledger's web interface.  It starts a simple web application for browsing and adding transactions, and optionally opens@@ -106,6 +106,9 @@ '--rules-file=RULESFILE'       Conversion rules file to use when reading CSV (default: FILE.rules)+'--separator=CHAR'++     Field separator to expect when reading CSV (default: ',') '--alias=OLD=NEW'       rename accounts named OLD to NEW@@ -209,7 +212,7 @@  Tag Table: Node: Top72-Node: OPTIONS3158-Ref: #options3243+Node: OPTIONS3160+Ref: #options3245  End Tag Table
embeddedfiles/hledger-web.txt view
@@ -105,6 +105,9 @@               Conversion   rules  file  to  use  when  reading  CSV  (default:               FILE.rules) +       --separator=CHAR+              Field separator to expect when reading CSV (default: `,')+        --alias=OLD=NEW               rename accounts named OLD to NEW @@ -248,4 +251,4 @@   -hledger-web 1.9.99                 June 2018                    hledger-web(1)+hledger-web 1.10.99             September 2018                  hledger-web(1)
embeddedfiles/hledger.1 view
@@ -1,6 +1,6 @@ .\"t -.TH "hledger" "1" "June 2018" "hledger 1.9.99" "hledger User Manuals"+.TH "hledger" "1" "September 2018" "hledger 1.10.99" "hledger User Manuals"   @@ -188,6 +188,11 @@ .RS .RE .TP+.B \f[C]\-\-separator=CHAR\f[]+Field separator to expect when reading CSV (default: `,')+.RS+.RE+.TP .B \f[C]\-\-alias=OLD=NEW\f[] rename accounts named OLD to NEW .RS@@ -2241,6 +2246,11 @@ This was formerly called \[lq]equity\[rq], as in Ledger, and that alias is also accepted. See close \[en]help for more.+.SS files+.PP+List all files included in the journal.+With a REGEX argument, only file names matching the regular expression+(case sensitive) are shown. .SS help .PP Show any of the hledger manuals.@@ -2426,7 +2436,12 @@ selection. .SS prices .PP-Print all market prices from the journal.+Print market price directives from the journal.+With \[en]costs, also print synthetic market prices based on transaction+prices.+With \[en]inverted\-costs, also print inverse prices based on+transaction prices.+Prices (and postings providing prices) can be filtered by a query. .SS print .PP Show transactions from the journal.@@ -2759,6 +2774,11 @@ .SS rewrite .PP Print all transactions, adding custom postings to the matched ones.+.SS roi+.PP+Shows time\-weighted (TWR) and money\-weighted (IRR) rate of return on+your investments.+See \f[C]roi\ \-\-help\f[] for more. .SS stats .PP Show some journal statistics.@@ -2801,20 +2821,22 @@ .SS test .PP Run built\-in unit tests.-.IP-.nf-\f[C]-$\ hledger\ test-Cases:\ 74\ \ Tried:\ 74\ \ Errors:\ 0\ \ Failures:\ 0-\f[]-.fi .PP-This command runs hledger's built\-in unit tests and displays a quick-report.-With a regular expression argument, it selects only tests with matching-names.-It's mainly used in development, but it's also nice to be able to check-your hledger executable for smoke at any time.+Prints test names and their results on stdout.+If any test fails or gives an error, the exit code will be non\-zero.+.PP+Test names include a group prefix.+If a (exact, case sensitive) group prefix, or a full test name is+provided as the first argument, only that group or test is run.+.PP+If a numeric second argument is provided, it will set the randomness+seed, for repeatable results from tests using randomness (currently none+of them).+.PP+This is mainly used by developers, but it's nice to be able to+sanity\-check your installed hledger executable at any time.+All tests are expected to pass \- if you ever see otherwise, something+has gone wrong, please report a bug! .SH ADD\-ON COMMANDS .PP hledger also searches for external add\-on commands, and will include
embeddedfiles/hledger.info view
@@ -3,8 +3,8 @@  File: hledger.info,  Node: Top,  Next: EXAMPLES,  Up: (dir) -hledger(1) hledger 1.9.99-*************************+hledger(1) hledger 1.10.99+**************************  This is hledger's command-line interface (there are also curses and web interfaces).  Its basic function is to read a plain text file describing@@ -164,6 +164,9 @@ '--rules-file=RULESFILE'       Conversion rules file to use when reading CSV (default: FILE.rules)+'--separator=CHAR'++     Field separator to expect when reading CSV (default: ',') '--alias=OLD=NEW'       rename accounts named OLD to NEW@@ -909,6 +912,7 @@ * check-dates:: * check-dupes:: * close::+* files:: * help:: * import:: * incomestatement::@@ -918,6 +922,7 @@ * register:: * register-match:: * rewrite::+* roi:: * stats:: * tags:: * test::@@ -1754,7 +1759,7 @@ example: http://stefanorodighiero.net/software/hledger-dupes.html  -File: hledger.info,  Node: close,  Next: help,  Prev: check-dupes,  Up: COMMANDS+File: hledger.info,  Node: close,  Next: files,  Prev: check-dupes,  Up: COMMANDS  4.10 close ==========@@ -1766,9 +1771,18 @@ alias is also accepted.  See close -help for more.  -File: hledger.info,  Node: help,  Next: import,  Prev: close,  Up: COMMANDS+File: hledger.info,  Node: files,  Next: help,  Prev: close,  Up: COMMANDS -4.11 help+4.11 files+==========++List all files included in the journal.  With a REGEX argument, only+file names matching the regular expression (case sensitive) are shown.+++File: hledger.info,  Node: help,  Next: import,  Prev: files,  Up: COMMANDS++4.12 help =========  Show any of the hledger manuals.@@ -1805,7 +1819,7 @@  File: hledger.info,  Node: import,  Next: incomestatement,  Prev: help,  Up: COMMANDS -4.12 import+4.13 import ===========  Read new transactions added to each FILE since last run, and add them to@@ -1831,7 +1845,7 @@  File: hledger.info,  Node: incomestatement,  Next: prices,  Prev: import,  Up: COMMANDS -4.13 incomestatement+4.14 incomestatement ====================  This command displays a simple income statement, showing revenues and@@ -1918,15 +1932,18 @@  File: hledger.info,  Node: prices,  Next: print,  Prev: incomestatement,  Up: COMMANDS -4.14 prices+4.15 prices =========== -Print all market prices from the journal.+Print market price directives from the journal.  With -costs, also print+synthetic market prices based on transaction prices.  With+-inverted-costs, also print inverse prices based on transaction prices.+Prices (and postings providing prices) can be filtered by a query.   File: hledger.info,  Node: print,  Next: print-unique,  Prev: prices,  Up: COMMANDS -4.15 print+4.16 print ==========  Show transactions from the journal.  Aliases: p, txns.@@ -2043,7 +2060,7 @@  File: hledger.info,  Node: print-unique,  Next: register,  Prev: print,  Up: COMMANDS -4.16 print-unique+4.17 print-unique =================  Print transactions which do not reuse an already-seen description.@@ -2051,7 +2068,7 @@  File: hledger.info,  Node: register,  Next: register-match,  Prev: print-unique,  Up: COMMANDS -4.17 register+4.18 register =============  Show postings and their running total.  Aliases: r, reg.@@ -2156,7 +2173,7 @@  File: hledger.info,  Node: Custom register output,  Up: register -4.17.1 Custom register output+4.18.1 Custom register output -----------------------------  register uses the full terminal width by default, except on windows.@@ -2187,7 +2204,7 @@  File: hledger.info,  Node: register-match,  Next: rewrite,  Prev: register,  Up: COMMANDS -4.18 register-match+4.19 register-match ===================  Print the one posting whose transaction description is closest to DESC,@@ -2195,17 +2212,26 @@ already-seen transactions when importing.  -File: hledger.info,  Node: rewrite,  Next: stats,  Prev: register-match,  Up: COMMANDS+File: hledger.info,  Node: rewrite,  Next: roi,  Prev: register-match,  Up: COMMANDS -4.19 rewrite+4.20 rewrite ============  Print all transactions, adding custom postings to the matched ones.  -File: hledger.info,  Node: stats,  Next: tags,  Prev: rewrite,  Up: COMMANDS+File: hledger.info,  Node: roi,  Next: stats,  Prev: rewrite,  Up: COMMANDS -4.20 stats+4.21 roi+========++Shows time-weighted (TWR) and money-weighted (IRR) rate of return on+your investments.  See 'roi --help' for more.+++File: hledger.info,  Node: stats,  Next: tags,  Prev: roi,  Up: COMMANDS++4.22 stats ==========  Show some journal statistics.@@ -2237,7 +2263,7 @@  File: hledger.info,  Node: tags,  Next: test,  Prev: stats,  Up: COMMANDS -4.21 tags+4.23 tags =========  List all the tag names used in the journal.  With a TAGREGEX argument,@@ -2248,19 +2274,27 @@  File: hledger.info,  Node: test,  Prev: tags,  Up: COMMANDS -4.22 test+4.24 test =========  Run built-in unit tests. -$ hledger test-Cases: 74  Tried: 74  Errors: 0  Failures: 0+   Prints test names and their results on stdout.  If any test fails or+gives an error, the exit code will be non-zero. -   This command runs hledger's built-in unit tests and displays a quick-report.  With a regular expression argument, it selects only tests with-matching names.  It's mainly used in development, but it's also nice to-be able to check your hledger executable for smoke at any time.+   Test names include a group prefix.  If a (exact, case sensitive)+group prefix, or a full test name is provided as the first argument,+only that group or test is run. +   If a numeric second argument is provided, it will set the randomness+seed, for repeatable results from tests using randomness (currently none+of them).++   This is mainly used by developers, but it's nice to be able to+sanity-check your installed hledger executable at any time.  All tests+are expected to pass - if you ever see otherwise, something has gone+wrong, please report a bug!+  File: hledger.info,  Node: ADD-ON COMMANDS,  Prev: COMMANDS,  Up: Top @@ -2433,138 +2467,142 @@  Tag Table: Node: Top68-Node: EXAMPLES1888-Ref: #examples1988-Node: OPTIONS3634-Ref: #options3736-Node: General options4101-Ref: #general-options4226-Node: Command options6825-Ref: #command-options6976-Node: Command arguments7374-Ref: #command-arguments7528-Node: Argument files7649-Ref: #argument-files7800-Node: Special characters8066-Ref: #special-characters8219-Node: Input files9638-Ref: #input-files9774-Node: Smart dates11744-Ref: #smart-dates11885-Node: Report start & end date13291-Ref: #report-start-end-date13461-Node: Report intervals14526-Ref: #report-intervals14689-Node: Period expressions15090-Ref: #period-expressions15250-Node: Depth limiting19207-Ref: #depth-limiting19351-Node: Pivoting19693-Ref: #pivoting19811-Node: Cost21487-Ref: #cost21595-Node: Market value21713-Ref: #market-value21848-Node: Combining -B and -V23214-Ref: #combining--b-and--v23377-Node: Output destination23524-Ref: #output-destination23686-Node: Output format23969-Ref: #output-format24121-Node: Regular expressions24506-Ref: #regular-expressions24643-Node: QUERIES26004-Ref: #queries26106-Node: COMMANDS30068-Ref: #commands30180-Node: accounts31162-Ref: #accounts31260-Node: activity32506-Ref: #activity32616-Node: add32976-Ref: #add33075-Node: balance35736-Ref: #balance35847-Node: Classic balance report38930-Ref: #classic-balance-report39103-Node: Customising the classic balance report40472-Ref: #customising-the-classic-balance-report40700-Node: Colour support42774-Ref: #colour-support42941-Node: Flat mode43114-Ref: #flat-mode43262-Node: Depth limited balance reports43675-Ref: #depth-limited-balance-reports43875-Node: Multicolumn balance report44331-Ref: #multicolumn-balance-report44529-Node: Budget report49709-Ref: #budget-report49852-Ref: #output-format-152886-Node: balancesheet52964-Ref: #balancesheet53100-Node: balancesheetequity55411-Ref: #balancesheetequity55560-Node: cashflow56097-Ref: #cashflow56225-Node: check-dates58348-Ref: #check-dates58475-Node: check-dupes58592-Ref: #check-dupes58716-Node: close58853-Ref: #close58960-Node: help59290-Ref: #help59390-Node: import60464-Ref: #import60578-Node: incomestatement61308-Ref: #incomestatement61442-Node: prices63846-Ref: #prices63961-Node: print64004-Ref: #print64114-Node: print-unique69008-Ref: #print-unique69134-Node: register69202-Ref: #register69329-Node: Custom register output73830-Ref: #custom-register-output73959-Node: register-match75189-Ref: #register-match75323-Node: rewrite75506-Ref: #rewrite75623-Node: stats75692-Ref: #stats75795-Node: tags76665-Ref: #tags76763-Node: test76999-Ref: #test77083-Node: ADD-ON COMMANDS77451-Ref: #add-on-commands77561-Node: Official add-ons78848-Ref: #official-add-ons78988-Node: api79075-Ref: #api79164-Node: ui79216-Ref: #ui79315-Node: web79373-Ref: #web79462-Node: Third party add-ons79508-Ref: #third-party-add-ons79683-Node: diff79818-Ref: #diff79915-Node: iadd80014-Ref: #iadd80128-Node: interest80211-Ref: #interest80332-Node: irr80427-Ref: #irr80525-Node: Experimental add-ons80603-Ref: #experimental-add-ons80755-Node: autosync81035-Ref: #autosync81146-Node: chart81385-Ref: #chart81504-Node: check81575-Ref: #check81677+Node: EXAMPLES1890+Ref: #examples1990+Node: OPTIONS3636+Ref: #options3738+Node: General options4103+Ref: #general-options4228+Node: Command options6910+Ref: #command-options7061+Node: Command arguments7459+Ref: #command-arguments7613+Node: Argument files7734+Ref: #argument-files7885+Node: Special characters8151+Ref: #special-characters8304+Node: Input files9723+Ref: #input-files9859+Node: Smart dates11829+Ref: #smart-dates11970+Node: Report start & end date13376+Ref: #report-start-end-date13546+Node: Report intervals14611+Ref: #report-intervals14774+Node: Period expressions15175+Ref: #period-expressions15335+Node: Depth limiting19292+Ref: #depth-limiting19436+Node: Pivoting19778+Ref: #pivoting19896+Node: Cost21572+Ref: #cost21680+Node: Market value21798+Ref: #market-value21933+Node: Combining -B and -V23299+Ref: #combining--b-and--v23462+Node: Output destination23609+Ref: #output-destination23771+Node: Output format24054+Ref: #output-format24206+Node: Regular expressions24591+Ref: #regular-expressions24728+Node: QUERIES26089+Ref: #queries26191+Node: COMMANDS30153+Ref: #commands30265+Node: accounts31265+Ref: #accounts31363+Node: activity32609+Ref: #activity32719+Node: add33079+Ref: #add33178+Node: balance35839+Ref: #balance35950+Node: Classic balance report39033+Ref: #classic-balance-report39206+Node: Customising the classic balance report40575+Ref: #customising-the-classic-balance-report40803+Node: Colour support42877+Ref: #colour-support43044+Node: Flat mode43217+Ref: #flat-mode43365+Node: Depth limited balance reports43778+Ref: #depth-limited-balance-reports43978+Node: Multicolumn balance report44434+Ref: #multicolumn-balance-report44632+Node: Budget report49812+Ref: #budget-report49955+Ref: #output-format-152989+Node: balancesheet53067+Ref: #balancesheet53203+Node: balancesheetequity55514+Ref: #balancesheetequity55663+Node: cashflow56200+Ref: #cashflow56328+Node: check-dates58451+Ref: #check-dates58578+Node: check-dupes58695+Ref: #check-dupes58819+Node: close58956+Ref: #close59064+Node: files59394+Ref: #files59495+Node: help59636+Ref: #help59736+Node: import60810+Ref: #import60924+Node: incomestatement61654+Ref: #incomestatement61788+Node: prices64192+Ref: #prices64307+Node: print64579+Ref: #print64689+Node: print-unique69583+Ref: #print-unique69709+Node: register69777+Ref: #register69904+Node: Custom register output74405+Ref: #custom-register-output74534+Node: register-match75764+Ref: #register-match75898+Node: rewrite76081+Ref: #rewrite76196+Node: roi76265+Ref: #roi76363+Node: stats76479+Ref: #stats76578+Node: tags77448+Ref: #tags77546+Node: test77782+Ref: #test77866+Node: ADD-ON COMMANDS78574+Ref: #add-on-commands78684+Node: Official add-ons79971+Ref: #official-add-ons80111+Node: api80198+Ref: #api80287+Node: ui80339+Ref: #ui80438+Node: web80496+Ref: #web80585+Node: Third party add-ons80631+Ref: #third-party-add-ons80806+Node: diff80941+Ref: #diff81038+Node: iadd81137+Ref: #iadd81251+Node: interest81334+Ref: #interest81455+Node: irr81550+Ref: #irr81648+Node: Experimental add-ons81726+Ref: #experimental-add-ons81878+Node: autosync82158+Ref: #autosync82269+Node: chart82508+Ref: #chart82627+Node: check82698+Ref: #check82800  End Tag Table
embeddedfiles/hledger.txt view
@@ -134,6 +134,9 @@               Conversion  rules  file  to  use  when  reading  CSV   (default:               FILE.rules) +       --separator=CHAR+              Field separator to expect when reading CSV (default: `,')+        --alias=OLD=NEW               rename accounts named OLD to NEW @@ -332,10 +335,6 @@        Examples:  ----        2004/10/1,     2004-01-01,            exact  date, several sepa-        2004.9.1                              rators allowed.   Year  is                                              4+  digits, month is 1-12,@@ -398,6 +397,7 @@                          rent month        -p thismonth      all  transactions  in  the                          current month+        date:2016/3/17-   the   above   written   as                          queries instead        date:-12/1@@ -531,6 +531,7 @@        -p "every 2nd Monday"  -  period bound-        aries will be on second Monday of  each        month+        -p "every 11/05"  - yearly periods with        boundaries on 5th of Nov        -p "every 5th Nov" - same@@ -1595,6 +1596,10 @@        a  period.   This  was formerly called "equity", as in Ledger, and that        alias is also accepted.  See close -help for more. +   files+       List all files included in the journal.  With a  REGEX  argument,  only+       file  names matching the regular expression (case sensitive) are shown.+    help        Show any of the hledger manuals. @@ -1727,13 +1732,16 @@        tion.     prices-       Print all market prices from the journal.+       Print market price directives from  the  journal.   With  -costs,  also+       print  synthetic  market  prices  based  on  transaction  prices.  With+       -inverted-costs, also print inverse prices based on transaction prices.+       Prices (and postings providing prices) can be filtered by a query.     print        Show transactions from the journal.  Aliases: p, txns.         -m STR --match=STR-              show the transaction whose description is most similar  to  STR,+              show  the  transaction whose description is most similar to STR,               and is most recent         --new  show only newer-dated transactions added in each file since last@@ -1746,7 +1754,7 @@               select the output format.  Supported formats: txt, csv.         -o FILE --output-file=FILE-              write output to FILE.  A file  extension  matching  one  of  the+              write  output  to  FILE.   A  file extension matching one of the               above formats selects that format.                $ hledger print@@ -1777,39 +1785,39 @@        it does not preserve directives or inter-transaction comments         Normally, the journal entry's explicit or implicit amount style is pre--       served.   Ie when an amount is omitted in the journal, it will be omit--       ted in the output.  You can use the  -x/--explicit  flag  to  make  all+       served.  Ie when an amount is omitted in the journal, it will be  omit-+       ted  in  the  output.   You  can use the -x/--explicit flag to make all        amounts explicit, which can be useful for troubleshooting or for making        your journal more readable and robust against data entry errors.  Note,-       -x  will  cause postings with a multi-commodity amount (these can arise-       when a multi-commodity transaction has  an  implicit  amount)  will  be-       split  into  multiple single-commodity postings, for valid journal out-+       -x will cause postings with a multi-commodity amount (these  can  arise+       when  a  multi-commodity  transaction  has  an implicit amount) will be+       split into multiple single-commodity postings, for valid  journal  out-        put. -       With -B/--cost, amounts with transaction prices are converted  to  cost+       With  -B/--cost,  amounts with transaction prices are converted to cost        using that price.  This can be used for troubleshooting. -       With  -m/--match and a STR argument, print will show at most one trans--       action: the one one whose description is most similar to  STR,  and  is-       most  recent.  STR should contain at least two characters.  If there is+       With -m/--match and a STR argument, print will show at most one  trans-+       action:  the  one  one whose description is most similar to STR, and is+       most recent.  STR should contain at least two characters.  If there  is        no similar-enough match, no transaction will be shown.         With --new, for each FILE being read, hledger reads (and writes) a spe--       cial  state  file  (.latest.FILE in the same directory), containing the-       latest transaction date(s) that were seen  last  time  FILE  was  read.-       When  this  file  is found, only transactions with newer dates (and new-       transactions on the latest date)  are  printed.   This  is  useful  for-       ignoring  already-seen  entries  in import data, such as downloaded CSV+       cial state file (.latest.FILE in the same  directory),  containing  the+       latest  transaction  date(s)  that  were  seen last time FILE was read.+       When this file is found, only transactions with newer  dates  (and  new+       transactions  on  the  latest  date)  are  printed.  This is useful for+       ignoring already-seen entries in import data, such  as  downloaded  CSV        files.  Eg:                $ hledger -f bank1.csv print --new               # shows transactions added since last print --new on this file -       This assumes that transactions  added  to  FILE  always  have  same  or-       increasing  dates,  and  that  transactions  on the same day do not get+       This  assumes  that  transactions  added  to  FILE  always have same or+       increasing dates, and that transactions on the  same  day  do  not  get        reordered.  See also the import command. -       This command also supports output destination and output format  selec-+       This  command also supports output destination and output format selec-        tion.  Here's an example of print's CSV output:                $ hledger print -Ocsv@@ -1826,20 +1834,20 @@               "5","2008/12/31","","*","","pay off","","liabilities:debts","1","$","","1","",""               "5","2008/12/31","","*","","pay off","","assets:bank:checking","-1","$","1","","","" -       o There  is  one  CSV record per posting, with the parent transaction's+       o There is one CSV record per posting, with  the  parent  transaction's          fields repeated.         o The "txnidx" (transaction index) field shows which postings belong to-         the  same transaction.  (This number might change if transactions are-         reordered within the file, files are parsed/included in  a  different+         the same transaction.  (This number might change if transactions  are+         reordered  within  the file, files are parsed/included in a different          order, etc.) -       o The  amount  is  separated into "commodity" (the symbol) and "amount"+       o The amount is separated into "commodity" (the  symbol)  and  "amount"          (numeric quantity) fields.         o The numeric amount is repeated in either the "credit" or "debit" col--         umn,  for convenience.  (Those names are not accurate in the account--         ing sense; it just puts negative amounts under  credit  and  zero  or+         umn, for convenience.  (Those names are not accurate in the  account-+         ing  sense;  it  just  puts negative amounts under credit and zero or          greater amounts under debit.)     print-unique@@ -1852,7 +1860,7 @@               show running total from report start date (default)         -H --historical-              show  historical running total/balance (includes postings before+              show historical running total/balance (includes postings  before               report start date)         -A --average@@ -1863,18 +1871,18 @@               show postings' siblings instead         -w N --width=N-              set  output  width  (default:  terminal width or COLUMNS.  -wN,M+              set output width (default: terminal  width  or  COLUMNS.   -wN,M               sets description width as well)         -O FMT --output-format=FMT               select the output format.  Supported formats: txt, csv.         -o FILE --output-file=FILE-              write output to FILE.  A file  extension  matching  one  of  the+              write  output  to  FILE.   A  file extension matching one of the               above formats selects that format.         The register command displays postings, one per line, and their running-       total.  This is typically used with  a  query  selecting  a  particular+       total.   This  is  typically  used  with a query selecting a particular        account, to see that account's activity:                $ hledger register checking@@ -1883,8 +1891,8 @@               2008/06/02 save                 assets:bank:checking           $-1            $1               2008/12/31 pay off              assets:bank:checking           $-1             0 -       The  --historical/-H  flag  adds the balance from any undisplayed prior-       postings to the running total.  This is useful when  you  want  to  see+       The --historical/-H flag adds the balance from  any  undisplayed  prior+       postings  to  the  running  total.  This is useful when you want to see        only recent activity, with a historically accurate running balance:                $ hledger register checking -b 2008/6 --historical@@ -1894,23 +1902,23 @@         The --depth option limits the amount of sub-account detail displayed. -       The  --average/-A flag shows the running average posting amount instead+       The --average/-A flag shows the running average posting amount  instead        of the running total (so, the final number displayed is the average for-       the  whole  report period).  This flag implies --empty (see below).  It-       is affected by --historical.  It  works  best  when  showing  just  one+       the whole report period).  This flag implies --empty (see  below).   It+       is  affected  by  --historical.   It  works  best when showing just one        account and one commodity. -       The  --related/-r  flag shows the other postings in the transactions of+       The --related/-r flag shows the other postings in the  transactions  of        the postings which would normally be shown. -       With a reporting interval, register shows  summary  postings,  one  per+       With  a  reporting  interval,  register shows summary postings, one per        interval, aggregating the postings to each account:                $ hledger register --monthly income               2008/01                 income:salary                          $-1           $-1               2008/06                 income:gifts                           $-1           $-2 -       Periods  with no activity, and summary postings with a zero amount, are+       Periods with no activity, and summary postings with a zero amount,  are        not shown by default; use the --empty/-E flag to see them:                $ hledger register --monthly income -E@@ -1927,7 +1935,7 @@               2008/11                                                          0           $-2               2008/12                                                          0           $-2 -       Often, you'll want to see just one  line  per  interval.   The  --depth+       Often,  you'll  want  to  see  just one line per interval.  The --depth        option helps with this, causing subaccounts to be aggregated:                $ hledger register --monthly assets --depth 1h@@ -1935,18 +1943,18 @@               2008/06                 assets                                 $-1             0               2008/12                 assets                                 $-1           $-1 -       Note  when using report intervals, if you specify start/end dates these-       will be adjusted outward if necessary to  contain  a  whole  number  of-       intervals.   This  ensures  that  the first and last intervals are full+       Note when using report intervals, if you specify start/end dates  these+       will  be  adjusted  outward  if  necessary to contain a whole number of+       intervals.  This ensures that the first and  last  intervals  are  full        length and comparable to the others in the report.     Custom register output-       register uses the full terminal width by default,  except  on  windows.-       You  can override this by setting the COLUMNS environment variable (not+       register  uses  the  full terminal width by default, except on windows.+       You can override this by setting the COLUMNS environment variable  (not        a bash shell variable) or by using the --width/-w option. -       The description and account columns normally share  the  space  equally-       (about  half  of  (width  - 40) each).  You can adjust this by adding a+       The  description  and  account columns normally share the space equally+       (about half of (width - 40) each).  You can adjust  this  by  adding  a        description  width  as  part  of  -width's  argument,  comma-separated:        --width W,D .  Here's a diagram: @@ -1963,17 +1971,21 @@               $ hledger reg -w 100,40           # set overall width 100, description width 40               $ hledger reg -w $COLUMNS,40      # use terminal width, and set description width -       This  command also supports output destination and output format selec-+       This command also supports output destination and output format  selec-        tion.     register-match        Print the one posting whose transaction description is closest to DESC,-       in  the  style  of  the register command.  Helps ledger-autosync detect+       in the style of the register  command.   Helps  ledger-autosync  detect        already-seen transactions when importing.     rewrite        Print all transactions, adding custom postings to the matched ones. +   roi+       Shows  time-weighted  (TWR)  and money-weighted (IRR) rate of return on+       your investments.  See roi --help for more.+    stats        Show some journal statistics. @@ -2009,37 +2021,45 @@    test        Run built-in unit tests. -              $ hledger test-              Cases: 74  Tried: 74  Errors: 0  Failures: 0+       Prints  test  names  and their results on stdout.  If any test fails or+       gives an error, the exit code will be non-zero. -       This  command  runs  hledger's built-in unit tests and displays a quick-       report.  With a regular expression argument, it selects only tests with-       matching names.  It's mainly used in development, but it's also nice to-       be able to check your hledger executable for smoke at any time.+       Test names include a group prefix.  If a (exact, case sensitive)  group+       prefix,  or  a  full  test name is provided as the first argument, only+       that group or test is run. +       If a numeric second argument is provided, it will  set  the  randomness+       seed,  for  repeatable  results  from tests using randomness (currently+       none of them).++       This is mainly used by developers, but it's nice to  be  able  to  san-+       ity-check your installed hledger executable at any time.  All tests are+       expected to pass - if you ever see otherwise, something has gone wrong,+       please report a bug!+ ADD-ON COMMANDS-       hledger also searches for external add-on commands,  and  will  include+       hledger  also  searches  for external add-on commands, and will include        these in the commands list.  These are programs or scripts in your PATH-       whose name starts with hledger- and ends with a recognised file  exten-+       whose  name starts with hledger- and ends with a recognised file exten-        sion (currently: no extension, bat,com,exe, hs,lhs,pl,py,rb,rkt,sh). -       Add-ons  can  be  invoked like any hledger command, but there are a few+       Add-ons can be invoked like any hledger command, but there  are  a  few        things to be aware of.  Eg if the hledger-web add-on is installed,         o hledger -h web  shows  hledger's  help,  while  hledger web -h  shows          hledger-web's help. -       o Flags  specific  to  the add-on must have a preceding -- to hide them-         from hledger.  So hledger web --serve --port 9000 will  be  rejected;+       o Flags specific to the add-on must have a preceding --  to  hide  them+         from  hledger.   So hledger web --serve --port 9000 will be rejected;          you must use hledger web -- --serve --port 9000. -       o You    can    always    run    add-ons    directly    if   preferred:+       o You   can    always    run    add-ons    directly    if    preferred:          hledger-web --serve --port 9000. -       Add-ons are a relatively easy way to add local features  or  experiment-       with  new  ideas.   They  can  be  written in any language, but haskell-       scripts have a big advantage:  they  can  use  the  same  hledger  (and-       haskell)  library functions that built-in commands do, for command-line+       Add-ons  are  a relatively easy way to add local features or experiment+       with new ideas.  They can be  written  in  any  language,  but  haskell+       scripts  have  a  big  advantage:  they  can  use the same hledger (and+       haskell) library functions that built-in commands do, for  command-line        options, journal parsing, reporting, etc.         Here are some hledger add-ons available:@@ -2057,7 +2077,7 @@        hledger-web provides a simple web interface.     Third party add-ons-       These are maintained separately, and usually updated  shortly  after  a+       These  are  maintained  separately, and usually updated shortly after a        hledger release.     diff@@ -2065,7 +2085,7 @@        journal file and another.     iadd-       hledger-iadd is a curses-style, more interactive  replacement  for  the+       hledger-iadd  is  a  curses-style, more interactive replacement for the        add command.     interest@@ -2073,19 +2093,19 @@        ing to various schemes.     irr-       hledger-irr calculates the internal rate of  return  of  an  investment+       hledger-irr  calculates  the  internal  rate of return of an investment        account.     Experimental add-ons-       These  are  available  in source form in the hledger repo's bin/ direc-+       These are available in source form in the hledger  repo's  bin/  direc-        tory; installing them is pretty easy.  They may be less mature and doc--       umented  than  built-in commands.  Reading and tweaking these is a good+       umented than built-in commands.  Reading and tweaking these is  a  good        way to start making your own!     autosync        hledger-autosync is a symbolic link for easily running ledger-autosync,-       if  installed.   ledger-autosync  does  deduplicating conversion of OFX-       data and some CSV formats, and can also download the data if your  bank+       if installed.  ledger-autosync does  deduplicating  conversion  of  OFX+       data  and some CSV formats, and can also download the data if your bank        offers OFX Direct Connect.     chart@@ -2095,21 +2115,21 @@        hledger-check.hs checks more powerful account balance assertions.  ENVIRONMENT-       COLUMNS  The  screen  width used by the register command.  Default: the+       COLUMNS The screen width used by the register  command.   Default:  the        full terminal width.         LEDGER_FILE The journal file path when not specified with -f.  Default:-       ~/.hledger.journal  (on  windows,  perhaps C:/Users/USER/.hledger.jour-+       ~/.hledger.journal (on  windows,  perhaps  C:/Users/USER/.hledger.jour-        nal).  FILES-       Reads data from one or more files in hledger journal, timeclock,  time--       dot,   or   CSV   format   specified   with  -f,  or  $LEDGER_FILE,  or-       $HOME/.hledger.journal          (on          windows,           perhaps+       Reads  data from one or more files in hledger journal, timeclock, time-+       dot,  or  CSV  format  specified   with   -f,   or   $LEDGER_FILE,   or+       $HOME/.hledger.journal           (on          windows,          perhaps        C:/Users/USER/.hledger.journal).  BUGS-       The  need  to  precede  addon command options with -- when invoked from+       The need to precede addon command options with  --  when  invoked  from        hledger is awkward.         When input data contains non-ascii characters, a suitable system locale@@ -2122,33 +2142,33 @@        In a Cygwin/MSYS/Mintty window, the tab key is not supported in hledger        add. -       Not all of Ledger's journal file syntax is supported.  See file  format+       Not  all of Ledger's journal file syntax is supported.  See file format        differences. -       On  large  data  files,  hledger  is  slower  and uses more memory than+       On large data files, hledger  is  slower  and  uses  more  memory  than        Ledger.  TROUBLESHOOTING-       Here are some issues you might encounter  when  you  run  hledger  (and-       remember  you can also seek help from the IRC channel, mail list or bug+       Here  are  some  issues  you  might encounter when you run hledger (and+       remember you can also seek help from the IRC channel, mail list or  bug        tracker):         Successfully installed, but "No command `hledger' found"        stack and cabal install binaries into a special directory, which should-       be  added  to your PATH environment variable.  Eg on unix-like systems,+       be added to your PATH environment variable.  Eg on  unix-like  systems,        that is ~/.local/bin and ~/.cabal/bin respectively.         I set a custom LEDGER_FILE, but hledger is still using the default file-       LEDGER_FILE  should  be  a  real environment variable, not just a shell-       variable.  The command env | grep LEDGER_FILE should show it.  You  may+       LEDGER_FILE should be a real environment variable,  not  just  a  shell+       variable.   The command env | grep LEDGER_FILE should show it.  You may        need to use export.  Here's an explanation. -       "Illegal  byte  sequence"  or  "Invalid or incomplete multibyte or wide+       "Illegal byte sequence" or "Invalid or  incomplete  multibyte  or  wide        character" errors        In order to handle non-ascii letters and symbols (like ), hledger needs        an appropriate locale.  This is usually configured system-wide; you can        also configure it temporarily.  The locale may need to be one that sup--       ports  UTF-8,  if you built hledger with GHC < 7.2 (or possibly always,+       ports UTF-8, if you built hledger with GHC < 7.2 (or  possibly  always,        I'm not sure yet).         Here's  an  example  of  setting  the  locale  temporarily,  on  ubuntu@@ -2167,7 +2187,7 @@               $ echo "export LANG=en_US.UTF-8" >>~/.bash_profile               $ bash --login -       If  we  preferred  to  use eg fr_FR.utf8, we might have to install that+       If we preferred to use eg fr_FR.utf8, we might  have  to  install  that        first:                $ apt-get install language-pack-fr@@ -2188,7 +2208,7 @@   REPORTING BUGS-       Report  bugs at http://bugs.hledger.org (or on the #hledger IRC channel+       Report bugs at http://bugs.hledger.org (or on the #hledger IRC  channel        or hledger mail list)  @@ -2202,7 +2222,7 @@   SEE ALSO-       hledger(1),     hledger-ui(1),     hledger-web(1),      hledger-api(1),+       hledger(1),      hledger-ui(1),     hledger-web(1),     hledger-api(1),        hledger_csv(5), hledger_journal(5), hledger_timeclock(5), hledger_time-        dot(5), ledger(1) @@ -2210,4 +2230,4 @@   -hledger 1.9.99                     June 2018                        hledger(1)+hledger 1.10.99                 September 2018                      hledger(1)
embeddedfiles/hledger_csv.5 view
@@ -1,5 +1,5 @@ -.TH "hledger_csv" "5" "June 2018" "hledger 1.9.99" "hledger User Manuals"+.TH "hledger_csv" "5" "September 2018" "hledger 1.10.99" "hledger User Manuals"   
embeddedfiles/hledger_csv.info view
@@ -3,8 +3,8 @@  File: hledger_csv.info,  Node: Top,  Next: CSV RULES,  Up: (dir) -hledger_csv(5) hledger 1.9.99-*****************************+hledger_csv(5) hledger 1.10.99+******************************  hledger can read CSV (comma-separated value) files as if they were journal files, automatically converting each CSV record into a@@ -317,33 +317,33 @@  Tag Table: Node: Top72-Node: CSV RULES2167-Ref: #csv-rules2275-Node: skip2537-Ref: #skip2631-Node: date-format2803-Ref: #date-format2930-Node: field list3436-Ref: #field-list3573-Node: field assignment4278-Ref: #field-assignment4433-Node: conditional block4937-Ref: #conditional-block5091-Node: include5987-Ref: #include6117-Node: newest-first6348-Ref: #newest-first6462-Node: CSV TIPS6873-Ref: #csv-tips6967-Node: CSV ordering7085-Ref: #csv-ordering7203-Node: CSV accounts7384-Ref: #csv-accounts7522-Node: CSV amounts7776-Ref: #csv-amounts7922-Node: CSV balance assertions8697-Ref: #csv-balance-assertions8879-Node: Reading multiple CSV files9084-Ref: #reading-multiple-csv-files9254+Node: CSV RULES2169+Ref: #csv-rules2277+Node: skip2539+Ref: #skip2633+Node: date-format2805+Ref: #date-format2932+Node: field list3438+Ref: #field-list3575+Node: field assignment4280+Ref: #field-assignment4435+Node: conditional block4939+Ref: #conditional-block5093+Node: include5989+Ref: #include6119+Node: newest-first6350+Ref: #newest-first6464+Node: CSV TIPS6875+Ref: #csv-tips6969+Node: CSV ordering7087+Ref: #csv-ordering7205+Node: CSV accounts7386+Ref: #csv-accounts7524+Node: CSV amounts7778+Ref: #csv-amounts7924+Node: CSV balance assertions8699+Ref: #csv-balance-assertions8881+Node: Reading multiple CSV files9086+Ref: #reading-multiple-csv-files9256  End Tag Table
embeddedfiles/hledger_csv.txt view
@@ -249,4 +249,4 @@   -hledger 1.9.99                     June 2018                    hledger_csv(5)+hledger 1.10.99                 September 2018                  hledger_csv(5)
embeddedfiles/hledger_journal.5 view
@@ -1,6 +1,6 @@ .\"t -.TH "hledger_journal" "5" "June 2018" "hledger 1.9.99" "hledger User Manuals"+.TH "hledger_journal" "5" "September 2018" "hledger 1.10.99" "hledger User Manuals"   @@ -1011,7 +1011,8 @@ .PP If the path does not begin with a slash, it is relative to the current file.-Glob patterns (\f[C]*\f[]) are not currently supported.+The include file path may contain common glob patterns (e.g.+\f[C]*\f[]). .PP The \f[C]include\f[] directive can only be used in journal files. It can include journal, timeclock or timedot files, but not CSV files.@@ -1158,54 +1159,84 @@ .PD In future it will also help detect misspelled accounts. .PP-Account names can be followed by a numeric account code:+An account directive can also have indented subdirectives following it,+which are currently ignored.+Here is the full syntax: .IP .nf \f[C]-account\ assets\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 1000-account\ assets:bank:checking\ \ \ \ 1110-account\ liabilities\ \ \ \ \ \ \ \ \ \ \ \ \ 2000-account\ revenues\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 4000-account\ expenses\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ 6000+;\ account\ ACCTNAME+;\ \ \ [OPTIONALSUBDIRECTIVES]++account\ assets:bank:checking+\ \ a\ comment+\ \ some\-tag:12345 \f[] .fi+.SS Account display order .PP-This affects how accounts are sorted in account and balance reports:-accounts with codes are listed before accounts without codes, and in-increasing code order (instead of listing all accounts alphabetically).-Warning, this feature is incomplete; account codes do not yet affect-sort order in-.IP \[bu] 2-the \f[C]accounts\f[] command-.IP \[bu] 2-the \f[C]balance\f[] command's single\-column mode-.IP \[bu] 2-flat mode balance reports (to work around this, declare account codes on-the subaccounts as well).-.IP \[bu] 2-hledger\-web's sidebar+Account directives have another purpose: they set the order in which+accounts are displayed, in hledger reports, hledger\-ui accounts screen,+hledger\-web sidebar etc.+For example, say you have these top\-level accounts:+.IP+.nf+\f[C]+$\ accounts\ \-1+assets+equity+expenses+liabilities+misc+other+revenues+\f[]+.fi .PP-Account codes should be all numeric digits, unique, and separated from-the account name by at least two spaces (since account names may contain-single spaces).-By convention, often the first digit indicates the type of account, as-in this numbering scheme and the example above.-In future, we might use this to recognize account types.+By default, they are displayed in alphabetical order.+But if you add the following account directives to the journal:+.IP+.nf+\f[C]+account\ assets+account\ liabilities+account\ equity+account\ revenues+account\ expenses+\f[]+.fi .PP-An account directive can also have indented subdirectives following it,-which are currently ignored.-Here is the full syntax:+the display order changes to: .IP .nf \f[C]-;\ account\ ACCTNAME\ \ [OPTIONALCODE]-;\ \ \ [OPTIONALSUBDIRECTIVES]--account\ assets:bank:checking\ \ \ 1110-\ \ a\ comment-\ \ some\-tag:12345+$\ accounts\ \-1+assets+liabilities+equity+revenues+expenses+misc+other \f[] .fi+.PP+Ie, declared accounts first, in the order they were declared, followed+by any undeclared accounts in alphabetic order.+.PP+Note that sorting is done at each level of the account tree (within each+group of sibling accounts under the same parent).+This directive:+.IP+.nf+\f[C]+account\ other:zoo+\f[]+.fi+.PP+would influence the position of \f[C]zoo\f[] among \f[C]other\f[]'s+subaccounts, but not the position of \f[C]other\f[] among the top\-level+accounts. .SS Rewriting accounts .PP You can define account alias rules which rewrite your account names, or@@ -1373,7 +1404,7 @@ .PP A periodic transaction rule looks like a normal journal entry, with the date replaced by a tilde (\f[C]~\f[]) followed by a period expression-(mnemonic: \f[C]~\f[] looks like a repeating sine wave):+(mnemonic: \f[C]~\f[] looks like a recurring sine wave.): .IP .nf \f[C]@@ -1410,11 +1441,26 @@ They will look like normal transactions, but with an extra tag named \f[C]recur\f[], whose value is the generating period expression. .PP-Forecast transactions begin on or after the day after the latest normal-(non\-periodic) transaction in the journal, or today if there are none.+Forecast transactions start on the first occurrence, and end on the last+occurrence, of their interval within the forecast period.+The forecast period:+.IP \[bu] 2+begins on the later of+.RS 2+.IP \[bu] 2+the report start date if specified with \-b/\-p/date:+.IP \[bu] 2+the day after the latest normal (non\-periodic) transaction in the+journal, or today if there are no normal transactions.+.RE+.IP \[bu] 2+ends on the report end date if specified with \-e/\-p/date:, or 180 days+from today. .PP-They end on or before the report end date if specified, or 180 days from-today if unspecified.+where \[lq]today\[rq] means the current date at report time.+The \[lq]later of\[rq] rule ensures that forecast transactions do not+overlap normal transactions in time; they will begin only after normal+transactions end. .PP Forecasting can be useful for estimating balances into the future, and experimenting with different scenarios.@@ -1440,15 +1486,18 @@ .PP For more details, see: balance: Budget report and Cookbook: Budgeting and Forecasting.-.SS Automated postings .PP-Automated posting rules describe extra postings that should be added to-certain transactions at report time, when the \f[C]\-\-auto\f[] flag is-used.+.SS Transaction Modifiers .PP-An automated posting rule looks like a normal journal entry, except the-first line is an equal sign (\f[C]=\f[]) followed by a query (mnemonic:-\f[C]=\f[] looks like posting lines):+Transaction modifier rules describe changes that should be applied+automatically to certain transactions.+Currently, this means adding extra postings (also known as+\[lq]automated postings\[rq]).+Transaction modifiers are enabled by the \f[C]\-\-auto\f[] flag.+.PP+A transaction modifier rule looks a bit like a normal journal entry,+except the first line is an equal sign (\f[C]=\f[]) followed by a query+(mnemonic: \f[C]=\f[] suggests matching something.): .IP .nf \f[C]
embeddedfiles/hledger_journal.info view
@@ -4,8 +4,8 @@  File: hledger_journal.info,  Node: Top,  Next: FILE FORMAT,  Up: (dir) -hledger_journal(5) hledger 1.9.99-*********************************+hledger_journal(5) hledger 1.10.99+**********************************  hledger's usual data source is a plain text file containing journal entries in hledger journal format.  This file represents a standard@@ -82,7 +82,7 @@ * Tags:: * Directives:: * Periodic transactions::-* Automated postings::+* Transaction Modifiers::   File: hledger_journal.info,  Node: Transactions,  Next: Postings,  Up: FILE FORMAT@@ -853,6 +853,7 @@ * Default commodity:: * Market prices:: * Declaring accounts::+* Account display order:: * Rewriting accounts:: * Default parent account:: @@ -878,7 +879,8 @@ include path/to/file.journal     If the path does not begin with a slash, it is relative to the-current file.  Glob patterns ('*') are not currently supported.+current file.  The include file path may contain common glob patterns+(e.g.  '*').     The 'include' directive can only be used in journal files.  It can include journal, timeclock or timedot files, but not CSV files.@@ -1001,7 +1003,7 @@ another commodity using these prices.  -File: hledger_journal.info,  Node: Declaring accounts,  Next: Rewriting accounts,  Prev: Market prices,  Up: Directives+File: hledger_journal.info,  Node: Declaring accounts,  Next: Account display order,  Prev: Market prices,  Up: Directives  1.14.7 Declaring accounts -------------------------@@ -1015,46 +1017,71 @@ hledger add, hledger-iadd, hledger-web, and ledger-mode. In future it will also help detect misspelled accounts. -   Account names can be followed by a numeric account code:--account assets                  1000-account assets:bank:checking    1110-account liabilities             2000-account revenues                4000-account expenses                6000--   This affects how accounts are sorted in account and balance reports:-accounts with codes are listed before accounts without codes, and in-increasing code order (instead of listing all accounts alphabetically).-Warning, this feature is incomplete; account codes do not yet affect-sort order in--   * the 'accounts' command-   * the 'balance' command's single-column mode-   * flat mode balance reports (to work around this, declare account-     codes on the subaccounts as well).-   * hledger-web's sidebar--   Account codes should be all numeric digits, unique, and separated-from the account name by at least two spaces (since account names may-contain single spaces).  By convention, often the first digit indicates-the type of account, as in this numbering scheme and the example above.-In future, we might use this to recognize account types.-    An account directive can also have indented subdirectives following it, which are currently ignored.  Here is the full syntax: -; account ACCTNAME  [OPTIONALCODE]+; account ACCTNAME ;   [OPTIONALSUBDIRECTIVES] -account assets:bank:checking   1110+account assets:bank:checking   a comment   some-tag:12345  -File: hledger_journal.info,  Node: Rewriting accounts,  Next: Default parent account,  Prev: Declaring accounts,  Up: Directives+File: hledger_journal.info,  Node: Account display order,  Next: Rewriting accounts,  Prev: Declaring accounts,  Up: Directives -1.14.8 Rewriting accounts+1.14.8 Account display order+----------------------------++Account directives have another purpose: they set the order in which+accounts are displayed, in hledger reports, hledger-ui accounts screen,+hledger-web sidebar etc.  For example, say you have these top-level+accounts:++$ accounts -1+assets+equity+expenses+liabilities+misc+other+revenues++   By default, they are displayed in alphabetical order.  But if you add+the following account directives to the journal:++account assets+account liabilities+account equity+account revenues+account expenses++   the display order changes to:++$ accounts -1+assets+liabilities+equity+revenues+expenses+misc+other++   Ie, declared accounts first, in the order they were declared,+followed by any undeclared accounts in alphabetic order.++   Note that sorting is done at each level of the account tree (within+each group of sibling accounts under the same parent).  This directive:++account other:zoo++   would influence the position of 'zoo' among 'other''s subaccounts,+but not the position of 'other' among the top-level accounts.+++File: hledger_journal.info,  Node: Rewriting accounts,  Next: Default parent account,  Prev: Account display order,  Up: Directives++1.14.9 Rewriting accounts -------------------------  You can define account alias rules which rewrite your account names, or@@ -1082,7 +1109,7 @@  File: hledger_journal.info,  Node: Basic aliases,  Next: Regex aliases,  Up: Rewriting accounts -1.14.8.1 Basic aliases+1.14.9.1 Basic aliases ......................  To set an account alias, use the 'alias' directive in your journal file.@@ -1105,7 +1132,7 @@  File: hledger_journal.info,  Node: Regex aliases,  Next: Multiple aliases,  Prev: Basic aliases,  Up: Rewriting accounts -1.14.8.2 Regex aliases+1.14.9.2 Regex aliases ......................  There is also a more powerful variant that uses a regular expression,@@ -1130,7 +1157,7 @@  File: hledger_journal.info,  Node: Multiple aliases,  Next: end aliases,  Prev: Regex aliases,  Up: Rewriting accounts -1.14.8.3 Multiple aliases+1.14.9.3 Multiple aliases .........................  You can define as many aliases as you like using directives or@@ -1146,7 +1173,7 @@  File: hledger_journal.info,  Node: end aliases,  Prev: Multiple aliases,  Up: Rewriting accounts -1.14.8.4 'end aliases'+1.14.9.4 'end aliases' ......................  You can clear (forget) all currently defined aliases with the 'end@@ -1157,8 +1184,8 @@  File: hledger_journal.info,  Node: Default parent account,  Prev: Rewriting accounts,  Up: Directives -1.14.9 Default parent account------------------------------+1.14.10 Default parent account+------------------------------  You can specify a parent account which will be prepended to all accounts within a section of the journal.  Use the 'apply account' and 'end apply@@ -1196,7 +1223,7 @@ parent account.  -File: hledger_journal.info,  Node: Periodic transactions,  Next: Automated postings,  Prev: Directives,  Up: FILE FORMAT+File: hledger_journal.info,  Node: Periodic transactions,  Next: Transaction Modifiers,  Prev: Directives,  Up: FILE FORMAT  1.15 Periodic transactions ==========================@@ -1208,7 +1235,7 @@     A periodic transaction rule looks like a normal journal entry, with the date replaced by a tilde ('~') followed by a period expression-(mnemonic: '~' looks like a repeating sine wave):+(mnemonic: '~' looks like a recurring sine wave.):  ~ monthly     expenses:rent          $2000@@ -1245,13 +1272,23 @@ normal transactions, but with an extra tag named 'recur', whose value is the generating period expression. -   Forecast transactions begin on or after the day after the latest-normal (non-periodic) transaction in the journal, or today if there are-none.+   Forecast transactions start on the first occurrence, and end on the+last occurrence, of their interval within the forecast period.  The+forecast period: -   They end on or before the report end date if specified, or 180 days-from today if unspecified.+   * begins on the later of+        * the report start date if specified with -b/-p/date:+        * the day after the latest normal (non-periodic) transaction in+          the journal, or today if there are no normal transactions. +   * ends on the report end date if specified with -e/-p/date:, or 180+     days from today.++   where "today" means the current date at report time.  The "later of"+rule ensures that forecast transactions do not overlap normal+transactions in time; they will begin only after normal transactions+end.+    Forecasting can be useful for estimating balances into the future, and experimenting with different scenarios.  Note the start date logic means that forecasted transactions are automatically replaced by normal@@ -1283,17 +1320,19 @@ and Forecasting.  -File: hledger_journal.info,  Node: Automated postings,  Prev: Periodic transactions,  Up: FILE FORMAT+File: hledger_journal.info,  Node: Transaction Modifiers,  Prev: Periodic transactions,  Up: FILE FORMAT -1.16 Automated postings-=======================+1.16 Transaction Modifiers+========================== -Automated posting rules describe extra postings that should be added to-certain transactions at report time, when the '--auto' flag is used.+Transaction modifier rules describe changes that should be applied+automatically to certain transactions.  Currently, this means adding+extra postings (also known as "automated postings").  Transaction+modifiers are enabled by the '--auto' flag. -   An automated posting rule looks like a normal journal entry, except-the first line is an equal sign ('=') followed by a query (mnemonic: '='-looks like posting lines):+   A transaction modifier rule looks a bit like a normal journal entry,+except the first line is an equal sign ('=') followed by a query+(mnemonic: '=' suggests matching something.):  = expenses:gifts     budget:gifts  *-1@@ -1354,91 +1393,93 @@  Tag Table: Node: Top76-Node: FILE FORMAT2376-Ref: #file-format2500-Node: Transactions2784-Ref: #transactions2905-Node: Postings3589-Ref: #postings3716-Node: Dates4711-Ref: #dates4826-Node: Simple dates4891-Ref: #simple-dates5017-Node: Secondary dates5383-Ref: #secondary-dates5537-Node: Posting dates7100-Ref: #posting-dates7229-Node: Status8603-Ref: #status8723-Node: Description10431-Ref: #description10569-Node: Payee and note10888-Ref: #payee-and-note11002-Node: Account names11244-Ref: #account-names11387-Node: Amounts11874-Ref: #amounts12010-Node: Virtual Postings15027-Ref: #virtual-postings15186-Node: Balance Assertions16406-Ref: #balance-assertions16581-Node: Assertions and ordering17477-Ref: #assertions-and-ordering17663-Node: Assertions and included files18363-Ref: #assertions-and-included-files18604-Node: Assertions and multiple -f options18937-Ref: #assertions-and-multiple--f-options19191-Node: Assertions and commodities19323-Ref: #assertions-and-commodities19558-Node: Assertions and subaccounts20254-Ref: #assertions-and-subaccounts20486-Node: Assertions and virtual postings21007-Ref: #assertions-and-virtual-postings21214-Node: Balance Assignments21356-Ref: #balance-assignments21537-Node: Transaction prices22657-Ref: #transaction-prices22826-Node: Comments25094-Ref: #comments25228-Node: Tags26398-Ref: #tags26516-Node: Directives27918-Ref: #directives28061-Node: Comment blocks33917-Ref: #comment-blocks34062-Node: Including other files34238-Ref: #including-other-files34418-Node: Default year34807-Ref: #default-year34976-Node: Declaring commodities35399-Ref: #declaring-commodities35582-Node: Default commodity36809-Ref: #default-commodity36985-Node: Market prices37621-Ref: #market-prices37786-Node: Declaring accounts38627-Ref: #declaring-accounts38803-Node: Rewriting accounts40474-Ref: #rewriting-accounts40659-Node: Basic aliases41393-Ref: #basic-aliases41539-Node: Regex aliases42243-Ref: #regex-aliases42414-Node: Multiple aliases43132-Ref: #multiple-aliases43307-Node: end aliases43805-Ref: #end-aliases43952-Node: Default parent account44053-Ref: #default-parent-account44219-Node: Periodic transactions45103-Ref: #periodic-transactions45282-Node: Forecasting with periodic transactions46492-Ref: #forecasting-with-periodic-transactions46735-Node: Budgeting with periodic transactions47976-Ref: #budgeting-with-periodic-transactions48215-Node: Automated postings48674-Ref: #automated-postings48828-Node: EDITOR SUPPORT49967-Ref: #editor-support50085+Node: FILE FORMAT2378+Ref: #file-format2502+Node: Transactions2789+Ref: #transactions2910+Node: Postings3594+Ref: #postings3721+Node: Dates4716+Ref: #dates4831+Node: Simple dates4896+Ref: #simple-dates5022+Node: Secondary dates5388+Ref: #secondary-dates5542+Node: Posting dates7105+Ref: #posting-dates7234+Node: Status8608+Ref: #status8728+Node: Description10436+Ref: #description10574+Node: Payee and note10893+Ref: #payee-and-note11007+Node: Account names11249+Ref: #account-names11392+Node: Amounts11879+Ref: #amounts12015+Node: Virtual Postings15032+Ref: #virtual-postings15191+Node: Balance Assertions16411+Ref: #balance-assertions16586+Node: Assertions and ordering17482+Ref: #assertions-and-ordering17668+Node: Assertions and included files18368+Ref: #assertions-and-included-files18609+Node: Assertions and multiple -f options18942+Ref: #assertions-and-multiple--f-options19196+Node: Assertions and commodities19328+Ref: #assertions-and-commodities19563+Node: Assertions and subaccounts20259+Ref: #assertions-and-subaccounts20491+Node: Assertions and virtual postings21012+Ref: #assertions-and-virtual-postings21219+Node: Balance Assignments21361+Ref: #balance-assignments21542+Node: Transaction prices22662+Ref: #transaction-prices22831+Node: Comments25099+Ref: #comments25233+Node: Tags26403+Ref: #tags26521+Node: Directives27923+Ref: #directives28066+Node: Comment blocks33948+Ref: #comment-blocks34093+Node: Including other files34269+Ref: #including-other-files34449+Node: Default year34857+Ref: #default-year35026+Node: Declaring commodities35449+Ref: #declaring-commodities35632+Node: Default commodity36859+Ref: #default-commodity37035+Node: Market prices37671+Ref: #market-prices37836+Node: Declaring accounts38677+Ref: #declaring-accounts38856+Node: Account display order39406+Ref: #account-display-order39596+Node: Rewriting accounts40617+Ref: #rewriting-accounts40805+Node: Basic aliases41539+Ref: #basic-aliases41685+Node: Regex aliases42389+Ref: #regex-aliases42560+Node: Multiple aliases43278+Ref: #multiple-aliases43453+Node: end aliases43951+Ref: #end-aliases44098+Node: Default parent account44199+Ref: #default-parent-account44367+Node: Periodic transactions45251+Ref: #periodic-transactions45433+Node: Forecasting with periodic transactions46644+Ref: #forecasting-with-periodic-transactions46887+Node: Budgeting with periodic transactions48574+Ref: #budgeting-with-periodic-transactions48813+Node: Transaction Modifiers49272+Ref: #transaction-modifiers49435+Node: EDITOR SUPPORT50691+Ref: #editor-support50809  End Tag Table
embeddedfiles/hledger_journal.txt view
@@ -705,14 +705,15 @@               include path/to/file.journal         If  the path does not begin with a slash, it is relative to the current-       file.  Glob patterns (*) are not currently supported.+       file.  The include file path may contain  common  glob  patterns  (e.g.+       *). -       The include directive can only  be  used  in  journal  files.   It  can+       The  include  directive  can  only  be  used  in journal files.  It can        include journal, timeclock or timedot files, but not CSV files.     Default year-       You  can set a default year to be used for subsequent dates which don't-       specify a year.  This is a line beginning with Y followed by the  year.+       You can set a default year to be used for subsequent dates which  don't+       specify  a year.  This is a line beginning with Y followed by the year.        Eg:                Y2009      ; set default year to 2009@@ -732,8 +733,8 @@                 assets     Declaring commodities-       The  commodity  directive declares commodities which may be used in the-       journal (though currently we do not enforce this).  It may  be  written+       The commodity directive declares commodities which may be used  in  the+       journal  (though  currently we do not enforce this).  It may be written        on a single line, like this:                ; commodity EXAMPLEAMOUNT@@ -743,8 +744,8 @@               ; separating thousands with comma.               commodity 1,000.0000 AAAA -       or  on  multiple  lines, using the "format" subdirective.  In this case-       the commodity symbol appears twice and  should  be  the  same  in  both+       or on multiple lines, using the "format" subdirective.   In  this  case+       the  commodity  symbol  appears  twice  and  should be the same in both        places:                ; commodity SYMBOL@@ -756,19 +757,19 @@               commodity INR                 format INR 9,99,99,999.00 -       Commodity  directives  have  a second purpose: they define the standard+       Commodity directives have a second purpose: they  define  the  standard        display format for amounts in the commodity.  Normally the display for--       mat  is  inferred  from journal entries, but this can be unpredictable;-       declaring it with a commodity  directive  overrides  this  and  removes-       ambiguity.   Towards  this  end,  amounts  in commodity directives must-       always be written with a decimal point (a period or comma, followed  by+       mat is inferred from journal entries, but this  can  be  unpredictable;+       declaring  it  with  a  commodity  directive overrides this and removes+       ambiguity.  Towards this end,  amounts  in  commodity  directives  must+       always  be written with a decimal point (a period or comma, followed by        0 or more decimal digits).     Default commodity-       The  D  directive  sets a default commodity (and display format), to be+       The D directive sets a default commodity (and display  format),  to  be        used for amounts without a commodity symbol (ie, plain numbers).  (Note-       this  differs from Ledger's default commodity directive.) The commodity-       and display format will be applied  to  all  subsequent  commodity-less+       this differs from Ledger's default commodity directive.) The  commodity+       and  display  format  will  be applied to all subsequent commodity-less        amounts, or until the next D directive.                # commodity-less amounts should be treated as dollars@@ -783,9 +784,9 @@        a decimal point.     Market prices-       The P directive declares a market price,  which  is  an  exchange  rate+       The  P  directive  declares  a  market price, which is an exchange rate        between two commodities on a certain date.  (In Ledger, they are called-       "historical prices".) These are often obtained from a  stock  exchange,+       "historical  prices".)  These are often obtained from a stock exchange,        cryptocurrency exchange, or the foreign exchange market.         Here is the format:@@ -796,67 +797,84 @@         o COMMODITYA is the symbol of the commodity being priced -       o COMMODITYBAMOUNT  is an amount (symbol and quantity) in a second com-+       o COMMODITYBAMOUNT is an amount (symbol and quantity) in a second  com-          modity, giving the price in commodity B of one unit of commodity A. -       These two market price directives say that one euro was worth  1.35  US+       These  two  market price directives say that one euro was worth 1.35 US        dollars during 2009, and $1.40 from 2010 onward:                P 2009/1/1  $1.35               P 2010/1/1  $1.40 -       The  -V/--value flag can be used to convert reported amounts to another+       The -V/--value flag can be used to convert reported amounts to  another        commodity using these prices.     Declaring accounts-       The account directive predeclares account names.  The simplest form  is+       The  account directive predeclares account names.  The simplest form is        account ACCTNAME, eg:                account assets:bank:checking -       Currently  this  mainly  helps  with  account name autocompletion in eg+       Currently this mainly helps with  account  name  autocompletion  in  eg        hledger add, hledger-iadd, hledger-web, and ledger-mode.        In future it will also help detect misspelled accounts. -       Account names can be followed by a numeric account code:+       An account directive can also have indented subdirectives following it,+       which are currently ignored.  Here is the full syntax: -              account assets                  1000-              account assets:bank:checking    1110-              account liabilities             2000-              account revenues                4000-              account expenses                6000+              ; account ACCTNAME+              ;   [OPTIONALSUBDIRECTIVES] -       This affects how accounts are sorted in account  and  balance  reports:-       accounts  with  codes  are listed before accounts without codes, and in-       increasing code order (instead of listing all accounts alphabetically).-       Warning,  this  feature  is incomplete; account codes do not yet affect-       sort order in+              account assets:bank:checking+                a comment+                some-tag:12345 -       o the accounts command+   Account display order+       Account directives have another purpose: they set the  order  in  which+       accounts are displayed, in hledger reports, hledger-ui accounts screen,+       hledger-web sidebar etc.  For example, say  you  have  these  top-level+       accounts: -       o the balance command's single-column mode+              $ accounts -1+              assets+              equity+              expenses+              liabilities+              misc+              other+              revenues -       o flat mode balance reports (to work around this, declare account codes-         on the subaccounts as well).+       By  default,  they are displayed in alphabetical order.  But if you add+       the following account directives to the journal: -       o hledger-web's sidebar+              account assets+              account liabilities+              account equity+              account revenues+              account expenses -       Account  codes should be all numeric digits, unique, and separated from-       the account name by at least two spaces (since account names  may  con--       tain  single  spaces).   By convention, often the first digit indicates-       the type of account, as in this numbering scheme and the example above.-       In future, we might use this to recognize account types.+       the display order changes to: -       An account directive can also have indented subdirectives following it,-       which are currently ignored.  Here is the full syntax:+              $ accounts -1+              assets+              liabilities+              equity+              revenues+              expenses+              misc+              other -              ; account ACCTNAME  [OPTIONALCODE]-              ;   [OPTIONALSUBDIRECTIVES]+       Ie, declared accounts first, in the order they were declared,  followed+       by any undeclared accounts in alphabetic order. -              account assets:bank:checking   1110-                a comment-                some-tag:12345+       Note  that  sorting  is  done at each level of the account tree (within+       each group of sibling accounts under the same parent).  This directive: +              account other:zoo++       would  influence the position of zoo among other's subaccounts, but not+       the position of other among the top-level accounts.+    Rewriting accounts        You can define account alias rules which rewrite your account names, or        parts of them, before generating reports.  This can be useful for:@@ -976,7 +994,7 @@         A periodic transaction rule looks like a normal journal entry, with the        date replaced by a tilde (~) followed by a period expression (mnemonic:-       ~ looks like a repeating sine wave):+       ~ looks like a recurring sine wave.):                ~ monthly                   expenses:rent          $2000@@ -1003,56 +1021,71 @@        normal transactions, but with an extra tag named recur, whose value  is        the generating period expression. -       Forecast transactions begin on or after the day after the latest normal-       (non-periodic) transaction in the journal, or today if there are  none.+       Forecast  transactions  start  on  the first occurrence, and end on the+       last occurrence, of their interval within  the  forecast  period.   The+       forecast period: -       They  end  on  or  before the report end date if specified, or 180 days-       from today if unspecified.+       o begins on the later of -       Forecasting can be useful for estimating balances into the future,  and-       experimenting  with  different  scenarios.   Note  the start date logic+         o the report start date if specified with -b/-p/date:++         o the  day  after the latest normal (non-periodic) transaction in the+           journal, or today if there are no normal transactions.++       o ends on the report end date if specified  with  -e/-p/date:,  or  180+         days from today.++       where  "today"  means  the current date at report time.  The "later of"+       rule ensures that forecast transactions do not overlap normal  transac-+       tions in time; they will begin only after normal transactions end.++       Forecasting  can be useful for estimating balances into the future, and+       experimenting with different scenarios.   Note  the  start  date  logic        means that forecasted transactions are automatically replaced by normal        transactions as you add those.         Forecasting can also help with data entry: describe most of your trans--       actions with periodic rules, and every so  often  copy  the  output  of+       actions  with  periodic  rules,  and  every so often copy the output of        print --forecast to the journal.         You can generate one-time transactions too: just write a period expres--       sion specifying a date with no report interval.  (You could also  write-       a  normal  transaction  with  a future date, but remember this disables+       sion  specifying a date with no report interval.  (You could also write+       a normal transaction with a future date,  but  remember  this  disables        forecast transactions on previous dates.)     Budgeting with periodic transactions-       With the --budget flag, currently supported  by  the  balance  command,-       each  periodic transaction rule declares recurring budget goals for the-       specified accounts.  Eg the first example  above  declares  a  goal  of-       spending  $2000  on  rent  (and  also,  a goal of depositing $2000 into-       checking) every month.  Goals and actual performance can then  be  com-+       With  the  --budget  flag,  currently supported by the balance command,+       each periodic transaction rule declares recurring budget goals for  the+       specified  accounts.   Eg  the  first  example above declares a goal of+       spending $2000 on rent (and also,  a  goal  of  depositing  $2000  into+       checking)  every  month.  Goals and actual performance can then be com-        pared in budget reports. -       For  more  details, see: balance: Budget report and Cookbook: Budgeting+       For more details, see: balance: Budget report and  Cookbook:  Budgeting        and Forecasting. -   Automated postings-       Automated posting rules describe extra postings that should be added to-       certain transactions at report time, when the --auto flag is used. -       An automated posting rule looks like a normal journal entry, except the-       first line is an equal sign (=) followed by a query (mnemonic: =  looks-       like posting lines):+   Transaction Modifiers+       Transaction  modifier  rules  describe  changes  that should be applied+       automatically to certain transactions.  Currently,  this  means  adding+       extra postings (also known as "automated postings").  Transaction modi-+       fiers are enabled by the --auto flag. +       A transaction modifier rule looks a bit like a  normal  journal  entry,+       except  the  first  line  is  an  equal  sign  (=)  followed by a query+       (mnemonic: = suggests matching something.):+               = expenses:gifts                   budget:gifts  *-1                   assets:budget  *1 -       The  posting  amounts can be of the form *N, which means "the amount of-       the matched transaction's first posting, multiplied by  N".   They  can+       The posting amounts can be of the form *N, which means "the  amount  of+       the  matched  transaction's  first posting, multiplied by N".  They can        also be ordinary fixed amounts.  Fixed amounts with no commodity symbol-       will be given the same commodity as  the  matched  transaction's  first+       will  be  given  the  same commodity as the matched transaction's first        posting. -       This  example adds a corresponding (unbalanced) budget posting to every+       This example adds a corresponding (unbalanced) budget posting to  every        transaction involving the expenses:gifts account:                = expenses:gifts@@ -1068,16 +1101,16 @@                   (budget:gifts)            $-20                   assets -       Like postings recorded  by  hand,  automated  postings  participate  in+       Like  postings  recorded  by  hand,  automated  postings participate in        transaction balancing, missing amount inference and balance assertions.  EDITOR SUPPORT        Add-on modes exist for various text editors, to make working with jour--       nal  files  easier.   They add colour, navigation aids and helpful com--       mands.  For hledger users who  edit  the  journal  file  directly  (the+       nal files easier.  They add colour, navigation aids  and  helpful  com-+       mands.   For  hledger  users  who  edit  the journal file directly (the        majority), using one of these modes is quite recommended. -       These  were  written  with  Ledger  in mind, but also work with hledger+       These were written with Ledger in mind,  but  also  work  with  hledger        files:  @@ -1090,14 +1123,13 @@        Textmate       https://github.com/ledger/ledger/wiki/Using-TextMate-2        Text   Wran-   https://github.com/ledger/ledger/wiki/Edit-        gler           ing-Ledger-files-with-TextWrangler-        Visual  Stu-   https://marketplace.visualstudio.com/items?item-        dio Code       Name=mark-hansen.hledger-vscode    REPORTING BUGS-       Report bugs at http://bugs.hledger.org (or on the #hledger IRC  channel+       Report  bugs at http://bugs.hledger.org (or on the #hledger IRC channel        or hledger mail list)  @@ -1111,7 +1143,7 @@   SEE ALSO-       hledger(1),      hledger-ui(1),     hledger-web(1),     hledger-api(1),+       hledger(1),     hledger-ui(1),     hledger-web(1),      hledger-api(1),        hledger_csv(5), hledger_journal(5), hledger_timeclock(5), hledger_time-        dot(5), ledger(1) @@ -1119,4 +1151,4 @@   -hledger 1.9.99                     June 2018                hledger_journal(5)+hledger 1.10.99                 September 2018              hledger_journal(5)
embeddedfiles/hledger_timeclock.5 view
@@ -1,5 +1,5 @@ -.TH "hledger_timeclock" "5" "June 2018" "hledger 1.9.99" "hledger User Manuals"+.TH "hledger_timeclock" "5" "September 2018" "hledger 1.10.99" "hledger User Manuals"   
embeddedfiles/hledger_timeclock.info view
@@ -4,8 +4,8 @@  File: hledger_timeclock.info,  Node: Top,  Up: (dir) -hledger_timeclock(5) hledger 1.9.99-***********************************+hledger_timeclock(5) hledger 1.10.99+************************************  hledger can read timeclock files.  As with Ledger, these are (a subset of) timeclock.el's format, containing clock-in and clock-out entries as
embeddedfiles/hledger_timeclock.txt view
@@ -77,4 +77,4 @@   -hledger 1.9.99                     June 2018              hledger_timeclock(5)+hledger 1.10.99                 September 2018            hledger_timeclock(5)
embeddedfiles/hledger_timedot.5 view
@@ -1,5 +1,5 @@ -.TH "hledger_timedot" "5" "June 2018" "hledger 1.9.99" "hledger User Manuals"+.TH "hledger_timedot" "5" "September 2018" "hledger 1.10.99" "hledger User Manuals"   
embeddedfiles/hledger_timedot.info view
@@ -4,8 +4,8 @@  File: hledger_timedot.info,  Node: Top,  Next: FILE FORMAT,  Up: (dir) -hledger_timedot(5) hledger 1.9.99-*********************************+hledger_timedot(5) hledger 1.10.99+**********************************  Timedot is a plain text format for logging dated, categorised quantities (of time, usually), supported by hledger.  It is convenient for@@ -110,7 +110,7 @@  Tag Table: Node: Top76-Node: FILE FORMAT811-Ref: #file-format912+Node: FILE FORMAT813+Ref: #file-format914  End Tag Table
embeddedfiles/hledger_timedot.txt view
@@ -124,4 +124,4 @@   -hledger 1.9.99                     June 2018                hledger_timedot(5)+hledger 1.10.99                 September 2018              hledger_timedot(5)
hledger.1 view
@@ -1,6 +1,6 @@ .\"t -.TH "hledger" "1" "June 2018" "hledger 1.9.99" "hledger User Manuals"+.TH "hledger" "1" "September 2018" "hledger 1.10.99" "hledger User Manuals"   @@ -188,6 +188,11 @@ .RS .RE .TP+.B \f[C]\-\-separator=CHAR\f[]+Field separator to expect when reading CSV (default: `,')+.RS+.RE+.TP .B \f[C]\-\-alias=OLD=NEW\f[] rename accounts named OLD to NEW .RS@@ -2241,6 +2246,11 @@ This was formerly called \[lq]equity\[rq], as in Ledger, and that alias is also accepted. See close \[en]help for more.+.SS files+.PP+List all files included in the journal.+With a REGEX argument, only file names matching the regular expression+(case sensitive) are shown. .SS help .PP Show any of the hledger manuals.@@ -2426,7 +2436,12 @@ selection. .SS prices .PP-Print all market prices from the journal.+Print market price directives from the journal.+With \[en]costs, also print synthetic market prices based on transaction+prices.+With \[en]inverted\-costs, also print inverse prices based on+transaction prices.+Prices (and postings providing prices) can be filtered by a query. .SS print .PP Show transactions from the journal.@@ -2759,6 +2774,11 @@ .SS rewrite .PP Print all transactions, adding custom postings to the matched ones.+.SS roi+.PP+Shows time\-weighted (TWR) and money\-weighted (IRR) rate of return on+your investments.+See \f[C]roi\ \-\-help\f[] for more. .SS stats .PP Show some journal statistics.@@ -2801,20 +2821,22 @@ .SS test .PP Run built\-in unit tests.-.IP-.nf-\f[C]-$\ hledger\ test-Cases:\ 74\ \ Tried:\ 74\ \ Errors:\ 0\ \ Failures:\ 0-\f[]-.fi .PP-This command runs hledger's built\-in unit tests and displays a quick-report.-With a regular expression argument, it selects only tests with matching-names.-It's mainly used in development, but it's also nice to be able to check-your hledger executable for smoke at any time.+Prints test names and their results on stdout.+If any test fails or gives an error, the exit code will be non\-zero.+.PP+Test names include a group prefix.+If a (exact, case sensitive) group prefix, or a full test name is+provided as the first argument, only that group or test is run.+.PP+If a numeric second argument is provided, it will set the randomness+seed, for repeatable results from tests using randomness (currently none+of them).+.PP+This is mainly used by developers, but it's nice to be able to+sanity\-check your installed hledger executable at any time.+All tests are expected to pass \- if you ever see otherwise, something+has gone wrong, please report a bug! .SH ADD\-ON COMMANDS .PP hledger also searches for external add\-on commands, and will include
hledger.cabal view
@@ -2,10 +2,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 9d4dec437459d541e707fa97a836aa8b4878e685d84738bcb462c370387ad83a+-- hash: a53ed723ef2c43c6425e4bf2d40ae7a37b9816dcdbd49795a7a7972b4b4ca203  name:           hledger-version:        1.10+version:        1.11 synopsis:       Command-line interface for the hledger accounting tool description:    This is hledger's command-line interface.                 Its basic function is to read a plain text file describing@@ -25,7 +25,7 @@ maintainer:     Simon Michael <simon@joyful.com> license:        GPL-3 license-file:   LICENSE-tested-with:    GHC==7.10.3, GHC==8.0.2, GHC==8.2.2, GHC==8.4.1+tested-with:    GHC==7.10.3, GHC==8.0.2, GHC==8.2.2, GHC==8.4.3 build-type:     Simple cabal-version:  >= 1.10 extra-source-files:@@ -95,6 +95,7 @@       Hledger.Cli.Commands.Checkdupes       Hledger.Cli.Commands.Close       Hledger.Cli.Commands.Help+      Hledger.Cli.Commands.Files       Hledger.Cli.Commands.Import       Hledger.Cli.Commands.Incomestatement       Hledger.Cli.Commands.Prices@@ -103,34 +104,34 @@       Hledger.Cli.Commands.Register       Hledger.Cli.Commands.Registermatch       Hledger.Cli.Commands.Rewrite+      Hledger.Cli.Commands.Roi       Hledger.Cli.Commands.Stats       Hledger.Cli.Commands.Tags       Hledger.Cli.CompoundBalanceCommand   other-modules:       Paths_hledger   ghc-options: -Wall -fno-warn-unused-do-bind -fno-warn-name-shadowing -fno-warn-missing-signatures -fno-warn-type-defaults -fno-warn-orphans -optP-Wno-nonportable-include-path-  cpp-options: -DVERSION="1.10"+  cpp-options: -DVERSION="1.11"   build-depends:       Decimal     , Diff-    , HUnit     , ansi-terminal >=0.6.2.3     , base >=4.8 && <4.12     , base-compat-batteries >=0.10.1 && <0.11     , bytestring     , cmdargs >=0.10     , containers-    , csv     , data-default >=0.5     , directory+    , easytest     , file-embed >=0.0.10     , filepath     , hashable >=1.2.4     , haskeline >=0.6     , here-    , hledger-lib >=1.10 && <1.11+    , hledger-lib >=1.11 && <1.12     , lucid-    , megaparsec >=6.4.1+    , megaparsec >=6.4.1 && <7     , mtl     , mtl-compat     , old-time@@ -141,6 +142,7 @@     , safe >=0.2     , shakespeare >=2.0.2.2     , split >=0.1+    , statistics     , tabular >=0.2     , temporary     , text >=0.11@@ -162,26 +164,25 @@   hs-source-dirs:       app   ghc-options: -Wall -fno-warn-unused-do-bind -fno-warn-name-shadowing -fno-warn-missing-signatures -fno-warn-type-defaults -fno-warn-orphans -optP-Wno-nonportable-include-path-  cpp-options: -DVERSION="1.10"+  cpp-options: -DVERSION="1.11"   build-depends:       Decimal-    , HUnit     , ansi-terminal >=0.6.2.3     , base >=4.8 && <4.12     , base-compat-batteries >=0.10.1 && <0.11     , bytestring     , cmdargs >=0.10     , containers-    , csv     , data-default >=0.5     , directory+    , easytest     , file-embed >=0.0.10     , filepath     , haskeline >=0.6     , here     , hledger-    , hledger-lib >=1.10 && <1.11-    , megaparsec >=6.4.1+    , hledger-lib >=1.11 && <1.12+    , megaparsec >=6.4.1 && <7     , mtl     , mtl-compat     , old-time@@ -192,6 +193,7 @@     , safe >=0.2     , shakespeare >=2.0.2.2     , split >=0.1+    , statistics     , tabular >=0.2     , temporary     , text >=0.11@@ -216,26 +218,25 @@   hs-source-dirs:       test   ghc-options: -Wall -fno-warn-unused-do-bind -fno-warn-name-shadowing -fno-warn-missing-signatures -fno-warn-type-defaults -fno-warn-orphans -optP-Wno-nonportable-include-path-  cpp-options: -DVERSION="1.10"+  cpp-options: -DVERSION="1.11"   build-depends:       Decimal-    , HUnit     , ansi-terminal >=0.6.2.3     , base >=4.8 && <4.12     , base-compat-batteries >=0.10.1 && <0.11     , bytestring     , cmdargs >=0.10     , containers-    , csv     , data-default >=0.5     , directory+    , easytest     , file-embed >=0.0.10     , filepath     , haskeline >=0.6     , here     , hledger-    , hledger-lib >=1.10 && <1.11-    , megaparsec >=6.4.1+    , hledger-lib >=1.11 && <1.12+    , megaparsec >=6.4.1 && <7     , mtl     , mtl-compat     , old-time@@ -246,6 +247,7 @@     , safe >=0.2     , shakespeare >=2.0.2.2     , split >=0.1+    , statistics     , tabular >=0.2     , temporary     , test-framework@@ -272,7 +274,6 @@   ghc-options: -Wall -fno-warn-unused-do-bind -fno-warn-name-shadowing -fno-warn-missing-signatures -fno-warn-type-defaults -fno-warn-orphans -optP-Wno-nonportable-include-path   build-depends:       Decimal-    , HUnit     , ansi-terminal >=0.6.2.3     , base >=4.8 && <4.12     , base-compat-batteries >=0.10.1 && <0.11@@ -280,17 +281,17 @@     , cmdargs >=0.10     , containers     , criterion-    , csv     , data-default >=0.5     , directory+    , easytest     , file-embed >=0.0.10     , filepath     , haskeline >=0.6     , here     , hledger-    , hledger-lib >=1.10 && <1.11+    , hledger-lib >=1.11 && <1.12     , html-    , megaparsec >=6.4.1+    , megaparsec >=6.4.1 && <7     , mtl     , mtl-compat     , old-time@@ -301,6 +302,7 @@     , safe >=0.2     , shakespeare >=2.0.2.2     , split >=0.1+    , statistics     , tabular >=0.2     , temporary     , text >=0.11
hledger.info view
@@ -3,8 +3,8 @@  File: hledger.info,  Node: Top,  Next: EXAMPLES,  Up: (dir) -hledger(1) hledger 1.9.99-*************************+hledger(1) hledger 1.10.99+**************************  This is hledger's command-line interface (there are also curses and web interfaces).  Its basic function is to read a plain text file describing@@ -164,6 +164,9 @@ '--rules-file=RULESFILE'       Conversion rules file to use when reading CSV (default: FILE.rules)+'--separator=CHAR'++     Field separator to expect when reading CSV (default: ',') '--alias=OLD=NEW'       rename accounts named OLD to NEW@@ -909,6 +912,7 @@ * check-dates:: * check-dupes:: * close::+* files:: * help:: * import:: * incomestatement::@@ -918,6 +922,7 @@ * register:: * register-match:: * rewrite::+* roi:: * stats:: * tags:: * test::@@ -1754,7 +1759,7 @@ example: http://stefanorodighiero.net/software/hledger-dupes.html  -File: hledger.info,  Node: close,  Next: help,  Prev: check-dupes,  Up: COMMANDS+File: hledger.info,  Node: close,  Next: files,  Prev: check-dupes,  Up: COMMANDS  4.10 close ==========@@ -1766,9 +1771,18 @@ alias is also accepted.  See close -help for more.  -File: hledger.info,  Node: help,  Next: import,  Prev: close,  Up: COMMANDS+File: hledger.info,  Node: files,  Next: help,  Prev: close,  Up: COMMANDS -4.11 help+4.11 files+==========++List all files included in the journal.  With a REGEX argument, only+file names matching the regular expression (case sensitive) are shown.+++File: hledger.info,  Node: help,  Next: import,  Prev: files,  Up: COMMANDS++4.12 help =========  Show any of the hledger manuals.@@ -1805,7 +1819,7 @@  File: hledger.info,  Node: import,  Next: incomestatement,  Prev: help,  Up: COMMANDS -4.12 import+4.13 import ===========  Read new transactions added to each FILE since last run, and add them to@@ -1831,7 +1845,7 @@  File: hledger.info,  Node: incomestatement,  Next: prices,  Prev: import,  Up: COMMANDS -4.13 incomestatement+4.14 incomestatement ====================  This command displays a simple income statement, showing revenues and@@ -1918,15 +1932,18 @@  File: hledger.info,  Node: prices,  Next: print,  Prev: incomestatement,  Up: COMMANDS -4.14 prices+4.15 prices =========== -Print all market prices from the journal.+Print market price directives from the journal.  With -costs, also print+synthetic market prices based on transaction prices.  With+-inverted-costs, also print inverse prices based on transaction prices.+Prices (and postings providing prices) can be filtered by a query.   File: hledger.info,  Node: print,  Next: print-unique,  Prev: prices,  Up: COMMANDS -4.15 print+4.16 print ==========  Show transactions from the journal.  Aliases: p, txns.@@ -2043,7 +2060,7 @@  File: hledger.info,  Node: print-unique,  Next: register,  Prev: print,  Up: COMMANDS -4.16 print-unique+4.17 print-unique =================  Print transactions which do not reuse an already-seen description.@@ -2051,7 +2068,7 @@  File: hledger.info,  Node: register,  Next: register-match,  Prev: print-unique,  Up: COMMANDS -4.17 register+4.18 register =============  Show postings and their running total.  Aliases: r, reg.@@ -2156,7 +2173,7 @@  File: hledger.info,  Node: Custom register output,  Up: register -4.17.1 Custom register output+4.18.1 Custom register output -----------------------------  register uses the full terminal width by default, except on windows.@@ -2187,7 +2204,7 @@  File: hledger.info,  Node: register-match,  Next: rewrite,  Prev: register,  Up: COMMANDS -4.18 register-match+4.19 register-match ===================  Print the one posting whose transaction description is closest to DESC,@@ -2195,17 +2212,26 @@ already-seen transactions when importing.  -File: hledger.info,  Node: rewrite,  Next: stats,  Prev: register-match,  Up: COMMANDS+File: hledger.info,  Node: rewrite,  Next: roi,  Prev: register-match,  Up: COMMANDS -4.19 rewrite+4.20 rewrite ============  Print all transactions, adding custom postings to the matched ones.  -File: hledger.info,  Node: stats,  Next: tags,  Prev: rewrite,  Up: COMMANDS+File: hledger.info,  Node: roi,  Next: stats,  Prev: rewrite,  Up: COMMANDS -4.20 stats+4.21 roi+========++Shows time-weighted (TWR) and money-weighted (IRR) rate of return on+your investments.  See 'roi --help' for more.+++File: hledger.info,  Node: stats,  Next: tags,  Prev: roi,  Up: COMMANDS++4.22 stats ==========  Show some journal statistics.@@ -2237,7 +2263,7 @@  File: hledger.info,  Node: tags,  Next: test,  Prev: stats,  Up: COMMANDS -4.21 tags+4.23 tags =========  List all the tag names used in the journal.  With a TAGREGEX argument,@@ -2248,19 +2274,27 @@  File: hledger.info,  Node: test,  Prev: tags,  Up: COMMANDS -4.22 test+4.24 test =========  Run built-in unit tests. -$ hledger test-Cases: 74  Tried: 74  Errors: 0  Failures: 0+   Prints test names and their results on stdout.  If any test fails or+gives an error, the exit code will be non-zero. -   This command runs hledger's built-in unit tests and displays a quick-report.  With a regular expression argument, it selects only tests with-matching names.  It's mainly used in development, but it's also nice to-be able to check your hledger executable for smoke at any time.+   Test names include a group prefix.  If a (exact, case sensitive)+group prefix, or a full test name is provided as the first argument,+only that group or test is run. +   If a numeric second argument is provided, it will set the randomness+seed, for repeatable results from tests using randomness (currently none+of them).++   This is mainly used by developers, but it's nice to be able to+sanity-check your installed hledger executable at any time.  All tests+are expected to pass - if you ever see otherwise, something has gone+wrong, please report a bug!+  File: hledger.info,  Node: ADD-ON COMMANDS,  Prev: COMMANDS,  Up: Top @@ -2433,138 +2467,142 @@  Tag Table: Node: Top68-Node: EXAMPLES1888-Ref: #examples1988-Node: OPTIONS3634-Ref: #options3736-Node: General options4101-Ref: #general-options4226-Node: Command options6825-Ref: #command-options6976-Node: Command arguments7374-Ref: #command-arguments7528-Node: Argument files7649-Ref: #argument-files7800-Node: Special characters8066-Ref: #special-characters8219-Node: Input files9638-Ref: #input-files9774-Node: Smart dates11744-Ref: #smart-dates11885-Node: Report start & end date13291-Ref: #report-start-end-date13461-Node: Report intervals14526-Ref: #report-intervals14689-Node: Period expressions15090-Ref: #period-expressions15250-Node: Depth limiting19207-Ref: #depth-limiting19351-Node: Pivoting19693-Ref: #pivoting19811-Node: Cost21487-Ref: #cost21595-Node: Market value21713-Ref: #market-value21848-Node: Combining -B and -V23214-Ref: #combining--b-and--v23377-Node: Output destination23524-Ref: #output-destination23686-Node: Output format23969-Ref: #output-format24121-Node: Regular expressions24506-Ref: #regular-expressions24643-Node: QUERIES26004-Ref: #queries26106-Node: COMMANDS30068-Ref: #commands30180-Node: accounts31162-Ref: #accounts31260-Node: activity32506-Ref: #activity32616-Node: add32976-Ref: #add33075-Node: balance35736-Ref: #balance35847-Node: Classic balance report38930-Ref: #classic-balance-report39103-Node: Customising the classic balance report40472-Ref: #customising-the-classic-balance-report40700-Node: Colour support42774-Ref: #colour-support42941-Node: Flat mode43114-Ref: #flat-mode43262-Node: Depth limited balance reports43675-Ref: #depth-limited-balance-reports43875-Node: Multicolumn balance report44331-Ref: #multicolumn-balance-report44529-Node: Budget report49709-Ref: #budget-report49852-Ref: #output-format-152886-Node: balancesheet52964-Ref: #balancesheet53100-Node: balancesheetequity55411-Ref: #balancesheetequity55560-Node: cashflow56097-Ref: #cashflow56225-Node: check-dates58348-Ref: #check-dates58475-Node: check-dupes58592-Ref: #check-dupes58716-Node: close58853-Ref: #close58960-Node: help59290-Ref: #help59390-Node: import60464-Ref: #import60578-Node: incomestatement61308-Ref: #incomestatement61442-Node: prices63846-Ref: #prices63961-Node: print64004-Ref: #print64114-Node: print-unique69008-Ref: #print-unique69134-Node: register69202-Ref: #register69329-Node: Custom register output73830-Ref: #custom-register-output73959-Node: register-match75189-Ref: #register-match75323-Node: rewrite75506-Ref: #rewrite75623-Node: stats75692-Ref: #stats75795-Node: tags76665-Ref: #tags76763-Node: test76999-Ref: #test77083-Node: ADD-ON COMMANDS77451-Ref: #add-on-commands77561-Node: Official add-ons78848-Ref: #official-add-ons78988-Node: api79075-Ref: #api79164-Node: ui79216-Ref: #ui79315-Node: web79373-Ref: #web79462-Node: Third party add-ons79508-Ref: #third-party-add-ons79683-Node: diff79818-Ref: #diff79915-Node: iadd80014-Ref: #iadd80128-Node: interest80211-Ref: #interest80332-Node: irr80427-Ref: #irr80525-Node: Experimental add-ons80603-Ref: #experimental-add-ons80755-Node: autosync81035-Ref: #autosync81146-Node: chart81385-Ref: #chart81504-Node: check81575-Ref: #check81677+Node: EXAMPLES1890+Ref: #examples1990+Node: OPTIONS3636+Ref: #options3738+Node: General options4103+Ref: #general-options4228+Node: Command options6910+Ref: #command-options7061+Node: Command arguments7459+Ref: #command-arguments7613+Node: Argument files7734+Ref: #argument-files7885+Node: Special characters8151+Ref: #special-characters8304+Node: Input files9723+Ref: #input-files9859+Node: Smart dates11829+Ref: #smart-dates11970+Node: Report start & end date13376+Ref: #report-start-end-date13546+Node: Report intervals14611+Ref: #report-intervals14774+Node: Period expressions15175+Ref: #period-expressions15335+Node: Depth limiting19292+Ref: #depth-limiting19436+Node: Pivoting19778+Ref: #pivoting19896+Node: Cost21572+Ref: #cost21680+Node: Market value21798+Ref: #market-value21933+Node: Combining -B and -V23299+Ref: #combining--b-and--v23462+Node: Output destination23609+Ref: #output-destination23771+Node: Output format24054+Ref: #output-format24206+Node: Regular expressions24591+Ref: #regular-expressions24728+Node: QUERIES26089+Ref: #queries26191+Node: COMMANDS30153+Ref: #commands30265+Node: accounts31265+Ref: #accounts31363+Node: activity32609+Ref: #activity32719+Node: add33079+Ref: #add33178+Node: balance35839+Ref: #balance35950+Node: Classic balance report39033+Ref: #classic-balance-report39206+Node: Customising the classic balance report40575+Ref: #customising-the-classic-balance-report40803+Node: Colour support42877+Ref: #colour-support43044+Node: Flat mode43217+Ref: #flat-mode43365+Node: Depth limited balance reports43778+Ref: #depth-limited-balance-reports43978+Node: Multicolumn balance report44434+Ref: #multicolumn-balance-report44632+Node: Budget report49812+Ref: #budget-report49955+Ref: #output-format-152989+Node: balancesheet53067+Ref: #balancesheet53203+Node: balancesheetequity55514+Ref: #balancesheetequity55663+Node: cashflow56200+Ref: #cashflow56328+Node: check-dates58451+Ref: #check-dates58578+Node: check-dupes58695+Ref: #check-dupes58819+Node: close58956+Ref: #close59064+Node: files59394+Ref: #files59495+Node: help59636+Ref: #help59736+Node: import60810+Ref: #import60924+Node: incomestatement61654+Ref: #incomestatement61788+Node: prices64192+Ref: #prices64307+Node: print64579+Ref: #print64689+Node: print-unique69583+Ref: #print-unique69709+Node: register69777+Ref: #register69904+Node: Custom register output74405+Ref: #custom-register-output74534+Node: register-match75764+Ref: #register-match75898+Node: rewrite76081+Ref: #rewrite76196+Node: roi76265+Ref: #roi76363+Node: stats76479+Ref: #stats76578+Node: tags77448+Ref: #tags77546+Node: test77782+Ref: #test77866+Node: ADD-ON COMMANDS78574+Ref: #add-on-commands78684+Node: Official add-ons79971+Ref: #official-add-ons80111+Node: api80198+Ref: #api80287+Node: ui80339+Ref: #ui80438+Node: web80496+Ref: #web80585+Node: Third party add-ons80631+Ref: #third-party-add-ons80806+Node: diff80941+Ref: #diff81038+Node: iadd81137+Ref: #iadd81251+Node: interest81334+Ref: #interest81455+Node: irr81550+Ref: #irr81648+Node: Experimental add-ons81726+Ref: #experimental-add-ons81878+Node: autosync82158+Ref: #autosync82269+Node: chart82508+Ref: #chart82627+Node: check82698+Ref: #check82800  End Tag Table
hledger.txt view
@@ -134,6 +134,9 @@               Conversion  rules  file  to  use  when  reading  CSV   (default:               FILE.rules) +       --separator=CHAR+              Field separator to expect when reading CSV (default: `,')+        --alias=OLD=NEW               rename accounts named OLD to NEW @@ -332,10 +335,6 @@        Examples:  ----        2004/10/1,     2004-01-01,            exact  date, several sepa-        2004.9.1                              rators allowed.   Year  is                                              4+  digits, month is 1-12,@@ -398,6 +397,7 @@                          rent month        -p thismonth      all  transactions  in  the                          current month+        date:2016/3/17-   the   above   written   as                          queries instead        date:-12/1@@ -531,6 +531,7 @@        -p "every 2nd Monday"  -  period bound-        aries will be on second Monday of  each        month+        -p "every 11/05"  - yearly periods with        boundaries on 5th of Nov        -p "every 5th Nov" - same@@ -1595,6 +1596,10 @@        a  period.   This  was formerly called "equity", as in Ledger, and that        alias is also accepted.  See close -help for more. +   files+       List all files included in the journal.  With a  REGEX  argument,  only+       file  names matching the regular expression (case sensitive) are shown.+    help        Show any of the hledger manuals. @@ -1727,13 +1732,16 @@        tion.     prices-       Print all market prices from the journal.+       Print market price directives from  the  journal.   With  -costs,  also+       print  synthetic  market  prices  based  on  transaction  prices.  With+       -inverted-costs, also print inverse prices based on transaction prices.+       Prices (and postings providing prices) can be filtered by a query.     print        Show transactions from the journal.  Aliases: p, txns.         -m STR --match=STR-              show the transaction whose description is most similar  to  STR,+              show  the  transaction whose description is most similar to STR,               and is most recent         --new  show only newer-dated transactions added in each file since last@@ -1746,7 +1754,7 @@               select the output format.  Supported formats: txt, csv.         -o FILE --output-file=FILE-              write output to FILE.  A file  extension  matching  one  of  the+              write  output  to  FILE.   A  file extension matching one of the               above formats selects that format.                $ hledger print@@ -1777,39 +1785,39 @@        it does not preserve directives or inter-transaction comments         Normally, the journal entry's explicit or implicit amount style is pre--       served.   Ie when an amount is omitted in the journal, it will be omit--       ted in the output.  You can use the  -x/--explicit  flag  to  make  all+       served.  Ie when an amount is omitted in the journal, it will be  omit-+       ted  in  the  output.   You  can use the -x/--explicit flag to make all        amounts explicit, which can be useful for troubleshooting or for making        your journal more readable and robust against data entry errors.  Note,-       -x  will  cause postings with a multi-commodity amount (these can arise-       when a multi-commodity transaction has  an  implicit  amount)  will  be-       split  into  multiple single-commodity postings, for valid journal out-+       -x will cause postings with a multi-commodity amount (these  can  arise+       when  a  multi-commodity  transaction  has  an implicit amount) will be+       split into multiple single-commodity postings, for valid  journal  out-        put. -       With -B/--cost, amounts with transaction prices are converted  to  cost+       With  -B/--cost,  amounts with transaction prices are converted to cost        using that price.  This can be used for troubleshooting. -       With  -m/--match and a STR argument, print will show at most one trans--       action: the one one whose description is most similar to  STR,  and  is-       most  recent.  STR should contain at least two characters.  If there is+       With -m/--match and a STR argument, print will show at most one  trans-+       action:  the  one  one whose description is most similar to STR, and is+       most recent.  STR should contain at least two characters.  If there  is        no similar-enough match, no transaction will be shown.         With --new, for each FILE being read, hledger reads (and writes) a spe--       cial  state  file  (.latest.FILE in the same directory), containing the-       latest transaction date(s) that were seen  last  time  FILE  was  read.-       When  this  file  is found, only transactions with newer dates (and new-       transactions on the latest date)  are  printed.   This  is  useful  for-       ignoring  already-seen  entries  in import data, such as downloaded CSV+       cial state file (.latest.FILE in the same  directory),  containing  the+       latest  transaction  date(s)  that  were  seen last time FILE was read.+       When this file is found, only transactions with newer  dates  (and  new+       transactions  on  the  latest  date)  are  printed.  This is useful for+       ignoring already-seen entries in import data, such  as  downloaded  CSV        files.  Eg:                $ hledger -f bank1.csv print --new               # shows transactions added since last print --new on this file -       This assumes that transactions  added  to  FILE  always  have  same  or-       increasing  dates,  and  that  transactions  on the same day do not get+       This  assumes  that  transactions  added  to  FILE  always have same or+       increasing dates, and that transactions on the  same  day  do  not  get        reordered.  See also the import command. -       This command also supports output destination and output format  selec-+       This  command also supports output destination and output format selec-        tion.  Here's an example of print's CSV output:                $ hledger print -Ocsv@@ -1826,20 +1834,20 @@               "5","2008/12/31","","*","","pay off","","liabilities:debts","1","$","","1","",""               "5","2008/12/31","","*","","pay off","","assets:bank:checking","-1","$","1","","","" -       o There  is  one  CSV record per posting, with the parent transaction's+       o There is one CSV record per posting, with  the  parent  transaction's          fields repeated.         o The "txnidx" (transaction index) field shows which postings belong to-         the  same transaction.  (This number might change if transactions are-         reordered within the file, files are parsed/included in  a  different+         the same transaction.  (This number might change if transactions  are+         reordered  within  the file, files are parsed/included in a different          order, etc.) -       o The  amount  is  separated into "commodity" (the symbol) and "amount"+       o The amount is separated into "commodity" (the  symbol)  and  "amount"          (numeric quantity) fields.         o The numeric amount is repeated in either the "credit" or "debit" col--         umn,  for convenience.  (Those names are not accurate in the account--         ing sense; it just puts negative amounts under  credit  and  zero  or+         umn, for convenience.  (Those names are not accurate in the  account-+         ing  sense;  it  just  puts negative amounts under credit and zero or          greater amounts under debit.)     print-unique@@ -1852,7 +1860,7 @@               show running total from report start date (default)         -H --historical-              show  historical running total/balance (includes postings before+              show historical running total/balance (includes postings  before               report start date)         -A --average@@ -1863,18 +1871,18 @@               show postings' siblings instead         -w N --width=N-              set  output  width  (default:  terminal width or COLUMNS.  -wN,M+              set output width (default: terminal  width  or  COLUMNS.   -wN,M               sets description width as well)         -O FMT --output-format=FMT               select the output format.  Supported formats: txt, csv.         -o FILE --output-file=FILE-              write output to FILE.  A file  extension  matching  one  of  the+              write  output  to  FILE.   A  file extension matching one of the               above formats selects that format.         The register command displays postings, one per line, and their running-       total.  This is typically used with  a  query  selecting  a  particular+       total.   This  is  typically  used  with a query selecting a particular        account, to see that account's activity:                $ hledger register checking@@ -1883,8 +1891,8 @@               2008/06/02 save                 assets:bank:checking           $-1            $1               2008/12/31 pay off              assets:bank:checking           $-1             0 -       The  --historical/-H  flag  adds the balance from any undisplayed prior-       postings to the running total.  This is useful when  you  want  to  see+       The --historical/-H flag adds the balance from  any  undisplayed  prior+       postings  to  the  running  total.  This is useful when you want to see        only recent activity, with a historically accurate running balance:                $ hledger register checking -b 2008/6 --historical@@ -1894,23 +1902,23 @@         The --depth option limits the amount of sub-account detail displayed. -       The  --average/-A flag shows the running average posting amount instead+       The --average/-A flag shows the running average posting amount  instead        of the running total (so, the final number displayed is the average for-       the  whole  report period).  This flag implies --empty (see below).  It-       is affected by --historical.  It  works  best  when  showing  just  one+       the whole report period).  This flag implies --empty (see  below).   It+       is  affected  by  --historical.   It  works  best when showing just one        account and one commodity. -       The  --related/-r  flag shows the other postings in the transactions of+       The --related/-r flag shows the other postings in the  transactions  of        the postings which would normally be shown. -       With a reporting interval, register shows  summary  postings,  one  per+       With  a  reporting  interval,  register shows summary postings, one per        interval, aggregating the postings to each account:                $ hledger register --monthly income               2008/01                 income:salary                          $-1           $-1               2008/06                 income:gifts                           $-1           $-2 -       Periods  with no activity, and summary postings with a zero amount, are+       Periods with no activity, and summary postings with a zero amount,  are        not shown by default; use the --empty/-E flag to see them:                $ hledger register --monthly income -E@@ -1927,7 +1935,7 @@               2008/11                                                          0           $-2               2008/12                                                          0           $-2 -       Often, you'll want to see just one  line  per  interval.   The  --depth+       Often,  you'll  want  to  see  just one line per interval.  The --depth        option helps with this, causing subaccounts to be aggregated:                $ hledger register --monthly assets --depth 1h@@ -1935,18 +1943,18 @@               2008/06                 assets                                 $-1             0               2008/12                 assets                                 $-1           $-1 -       Note  when using report intervals, if you specify start/end dates these-       will be adjusted outward if necessary to  contain  a  whole  number  of-       intervals.   This  ensures  that  the first and last intervals are full+       Note when using report intervals, if you specify start/end dates  these+       will  be  adjusted  outward  if  necessary to contain a whole number of+       intervals.  This ensures that the first and  last  intervals  are  full        length and comparable to the others in the report.     Custom register output-       register uses the full terminal width by default,  except  on  windows.-       You  can override this by setting the COLUMNS environment variable (not+       register  uses  the  full terminal width by default, except on windows.+       You can override this by setting the COLUMNS environment variable  (not        a bash shell variable) or by using the --width/-w option. -       The description and account columns normally share  the  space  equally-       (about  half  of  (width  - 40) each).  You can adjust this by adding a+       The  description  and  account columns normally share the space equally+       (about half of (width - 40) each).  You can adjust  this  by  adding  a        description  width  as  part  of  -width's  argument,  comma-separated:        --width W,D .  Here's a diagram: @@ -1963,17 +1971,21 @@               $ hledger reg -w 100,40           # set overall width 100, description width 40               $ hledger reg -w $COLUMNS,40      # use terminal width, and set description width -       This  command also supports output destination and output format selec-+       This command also supports output destination and output format  selec-        tion.     register-match        Print the one posting whose transaction description is closest to DESC,-       in  the  style  of  the register command.  Helps ledger-autosync detect+       in the style of the register  command.   Helps  ledger-autosync  detect        already-seen transactions when importing.     rewrite        Print all transactions, adding custom postings to the matched ones. +   roi+       Shows  time-weighted  (TWR)  and money-weighted (IRR) rate of return on+       your investments.  See roi --help for more.+    stats        Show some journal statistics. @@ -2009,37 +2021,45 @@    test        Run built-in unit tests. -              $ hledger test-              Cases: 74  Tried: 74  Errors: 0  Failures: 0+       Prints  test  names  and their results on stdout.  If any test fails or+       gives an error, the exit code will be non-zero. -       This  command  runs  hledger's built-in unit tests and displays a quick-       report.  With a regular expression argument, it selects only tests with-       matching names.  It's mainly used in development, but it's also nice to-       be able to check your hledger executable for smoke at any time.+       Test names include a group prefix.  If a (exact, case sensitive)  group+       prefix,  or  a  full  test name is provided as the first argument, only+       that group or test is run. +       If a numeric second argument is provided, it will  set  the  randomness+       seed,  for  repeatable  results  from tests using randomness (currently+       none of them).++       This is mainly used by developers, but it's nice to  be  able  to  san-+       ity-check your installed hledger executable at any time.  All tests are+       expected to pass - if you ever see otherwise, something has gone wrong,+       please report a bug!+ ADD-ON COMMANDS-       hledger also searches for external add-on commands,  and  will  include+       hledger  also  searches  for external add-on commands, and will include        these in the commands list.  These are programs or scripts in your PATH-       whose name starts with hledger- and ends with a recognised file  exten-+       whose  name starts with hledger- and ends with a recognised file exten-        sion (currently: no extension, bat,com,exe, hs,lhs,pl,py,rb,rkt,sh). -       Add-ons  can  be  invoked like any hledger command, but there are a few+       Add-ons can be invoked like any hledger command, but there  are  a  few        things to be aware of.  Eg if the hledger-web add-on is installed,         o hledger -h web  shows  hledger's  help,  while  hledger web -h  shows          hledger-web's help. -       o Flags  specific  to  the add-on must have a preceding -- to hide them-         from hledger.  So hledger web --serve --port 9000 will  be  rejected;+       o Flags specific to the add-on must have a preceding --  to  hide  them+         from  hledger.   So hledger web --serve --port 9000 will be rejected;          you must use hledger web -- --serve --port 9000. -       o You    can    always    run    add-ons    directly    if   preferred:+       o You   can    always    run    add-ons    directly    if    preferred:          hledger-web --serve --port 9000. -       Add-ons are a relatively easy way to add local features  or  experiment-       with  new  ideas.   They  can  be  written in any language, but haskell-       scripts have a big advantage:  they  can  use  the  same  hledger  (and-       haskell)  library functions that built-in commands do, for command-line+       Add-ons  are  a relatively easy way to add local features or experiment+       with new ideas.  They can be  written  in  any  language,  but  haskell+       scripts  have  a  big  advantage:  they  can  use the same hledger (and+       haskell) library functions that built-in commands do, for  command-line        options, journal parsing, reporting, etc.         Here are some hledger add-ons available:@@ -2057,7 +2077,7 @@        hledger-web provides a simple web interface.     Third party add-ons-       These are maintained separately, and usually updated  shortly  after  a+       These  are  maintained  separately, and usually updated shortly after a        hledger release.     diff@@ -2065,7 +2085,7 @@        journal file and another.     iadd-       hledger-iadd is a curses-style, more interactive  replacement  for  the+       hledger-iadd  is  a  curses-style, more interactive replacement for the        add command.     interest@@ -2073,19 +2093,19 @@        ing to various schemes.     irr-       hledger-irr calculates the internal rate of  return  of  an  investment+       hledger-irr  calculates  the  internal  rate of return of an investment        account.     Experimental add-ons-       These  are  available  in source form in the hledger repo's bin/ direc-+       These are available in source form in the hledger  repo's  bin/  direc-        tory; installing them is pretty easy.  They may be less mature and doc--       umented  than  built-in commands.  Reading and tweaking these is a good+       umented than built-in commands.  Reading and tweaking these is  a  good        way to start making your own!     autosync        hledger-autosync is a symbolic link for easily running ledger-autosync,-       if  installed.   ledger-autosync  does  deduplicating conversion of OFX-       data and some CSV formats, and can also download the data if your  bank+       if installed.  ledger-autosync does  deduplicating  conversion  of  OFX+       data  and some CSV formats, and can also download the data if your bank        offers OFX Direct Connect.     chart@@ -2095,21 +2115,21 @@        hledger-check.hs checks more powerful account balance assertions.  ENVIRONMENT-       COLUMNS  The  screen  width used by the register command.  Default: the+       COLUMNS The screen width used by the register  command.   Default:  the        full terminal width.         LEDGER_FILE The journal file path when not specified with -f.  Default:-       ~/.hledger.journal  (on  windows,  perhaps C:/Users/USER/.hledger.jour-+       ~/.hledger.journal (on  windows,  perhaps  C:/Users/USER/.hledger.jour-        nal).  FILES-       Reads data from one or more files in hledger journal, timeclock,  time--       dot,   or   CSV   format   specified   with  -f,  or  $LEDGER_FILE,  or-       $HOME/.hledger.journal          (on          windows,           perhaps+       Reads  data from one or more files in hledger journal, timeclock, time-+       dot,  or  CSV  format  specified   with   -f,   or   $LEDGER_FILE,   or+       $HOME/.hledger.journal           (on          windows,          perhaps        C:/Users/USER/.hledger.journal).  BUGS-       The  need  to  precede  addon command options with -- when invoked from+       The need to precede addon command options with  --  when  invoked  from        hledger is awkward.         When input data contains non-ascii characters, a suitable system locale@@ -2122,33 +2142,33 @@        In a Cygwin/MSYS/Mintty window, the tab key is not supported in hledger        add. -       Not all of Ledger's journal file syntax is supported.  See file  format+       Not  all of Ledger's journal file syntax is supported.  See file format        differences. -       On  large  data  files,  hledger  is  slower  and uses more memory than+       On large data files, hledger  is  slower  and  uses  more  memory  than        Ledger.  TROUBLESHOOTING-       Here are some issues you might encounter  when  you  run  hledger  (and-       remember  you can also seek help from the IRC channel, mail list or bug+       Here  are  some  issues  you  might encounter when you run hledger (and+       remember you can also seek help from the IRC channel, mail list or  bug        tracker):         Successfully installed, but "No command `hledger' found"        stack and cabal install binaries into a special directory, which should-       be  added  to your PATH environment variable.  Eg on unix-like systems,+       be added to your PATH environment variable.  Eg on  unix-like  systems,        that is ~/.local/bin and ~/.cabal/bin respectively.         I set a custom LEDGER_FILE, but hledger is still using the default file-       LEDGER_FILE  should  be  a  real environment variable, not just a shell-       variable.  The command env | grep LEDGER_FILE should show it.  You  may+       LEDGER_FILE should be a real environment variable,  not  just  a  shell+       variable.   The command env | grep LEDGER_FILE should show it.  You may        need to use export.  Here's an explanation. -       "Illegal  byte  sequence"  or  "Invalid or incomplete multibyte or wide+       "Illegal byte sequence" or "Invalid or  incomplete  multibyte  or  wide        character" errors        In order to handle non-ascii letters and symbols (like ), hledger needs        an appropriate locale.  This is usually configured system-wide; you can        also configure it temporarily.  The locale may need to be one that sup--       ports  UTF-8,  if you built hledger with GHC < 7.2 (or possibly always,+       ports UTF-8, if you built hledger with GHC < 7.2 (or  possibly  always,        I'm not sure yet).         Here's  an  example  of  setting  the  locale  temporarily,  on  ubuntu@@ -2167,7 +2187,7 @@               $ echo "export LANG=en_US.UTF-8" >>~/.bash_profile               $ bash --login -       If  we  preferred  to  use eg fr_FR.utf8, we might have to install that+       If we preferred to use eg fr_FR.utf8, we might  have  to  install  that        first:                $ apt-get install language-pack-fr@@ -2188,7 +2208,7 @@   REPORTING BUGS-       Report  bugs at http://bugs.hledger.org (or on the #hledger IRC channel+       Report bugs at http://bugs.hledger.org (or on the #hledger IRC  channel        or hledger mail list)  @@ -2202,7 +2222,7 @@   SEE ALSO-       hledger(1),     hledger-ui(1),     hledger-web(1),      hledger-api(1),+       hledger(1),      hledger-ui(1),     hledger-web(1),     hledger-api(1),        hledger_csv(5), hledger_journal(5), hledger_timeclock(5), hledger_time-        dot(5), ledger(1) @@ -2210,4 +2230,4 @@   -hledger 1.9.99                     June 2018                        hledger(1)+hledger 1.10.99                 September 2018                      hledger(1)
test/test.hs view
@@ -1,13 +1,8 @@-import Hledger.Cli (tests_Hledger_Cli)-import System.Environment (getArgs)-import Test.Framework.Providers.HUnit (hUnitTestToTests)-import Test.Framework.Runners.Console (defaultMainWithArgs)--main :: IO ()-main = do-  args <- getArgs-  let args' = "--hide-successes" : args-  defaultMainWithArgs (hUnitTestToTests tests_Hledger_Cli) args'-+{-+Run hledger's (and hledger-lib's) unit tests as a cabal test suite,+by running the test command with no options.+-} +import Hledger.Cli +main = testcmd defcliopts (error "journal-less command tried to use the journal")