From c2929939e4e0fca802da36c1e84e1e646118a1a1 Mon Sep 17 00:00:00 2001 From: Simon Michael Date: Thu, 3 Sep 2020 09:48:50 -0700 Subject: [PATCH] make account type autodetection (& hledger-smooth) case insensitive again (#1341) lib: added case-insensitive variants of the accountNameToRegex functions. --- bin/hledger-smooth.hs | 2 +- hledger-lib/Hledger/Data/AccountName.hs | 12 +++++++ hledger-lib/Hledger/Data/Journal.hs | 12 +++---- tests/balancesheet.test | 44 +++++++++++++++++++------ 4 files changed, 53 insertions(+), 17 deletions(-) diff --git a/bin/hledger-smooth.hs b/bin/hledger-smooth.hs index 2abf5cbbf..499a9cc2c 100755 --- a/bin/hledger-smooth.hs +++ b/bin/hledger-smooth.hs @@ -66,7 +66,7 @@ main = do args = words' $ query_ ropts q = queryFromOpts today ropts acct = T.pack $ headDef (error' "Please provide an account name argument") args - pr = postingsReport ropts (And [Acct $ accountNameToAccountRegex acct, q]) j + pr = postingsReport ropts (And [Acct $ accountNameToAccountRegexCI acct, q]) j -- dates of postings to acct (in report) pdates = map (postingDate . fourth5) (snd pr) diff --git a/hledger-lib/Hledger/Data/AccountName.hs b/hledger-lib/Hledger/Data/AccountName.hs index ce137e868..b66618983 100644 --- a/hledger-lib/Hledger/Data/AccountName.hs +++ b/hledger-lib/Hledger/Data/AccountName.hs @@ -16,7 +16,9 @@ module Hledger.Data.AccountName ( ,accountNameFromComponents ,accountNameLevel ,accountNameToAccountOnlyRegex + ,accountNameToAccountOnlyRegexCI ,accountNameToAccountRegex + ,accountNameToAccountRegexCI ,accountNameTreeFrom ,accountSummarisedName ,acctsep @@ -218,10 +220,20 @@ escapeName = T.unpack . T.concatMap escapeChar accountNameToAccountRegex :: AccountName -> Regexp accountNameToAccountRegex a = toRegex' $ '^' : escapeName a ++ "(:|$)" -- PARTIAL: Is this safe after escapeName? +-- | Convert an account name to a regular expression matching it and its subaccounts, +-- case insensitively. +accountNameToAccountRegexCI :: AccountName -> Regexp +accountNameToAccountRegexCI a = toRegexCI' $ '^' : escapeName a ++ "(:|$)" -- PARTIAL: Is this safe after escapeName? + -- | Convert an account name to a regular expression matching it but not its subaccounts. accountNameToAccountOnlyRegex :: AccountName -> Regexp accountNameToAccountOnlyRegex a = toRegex' $ '^' : escapeName a ++ "$" -- PARTIAL: Is this safe after escapeName? +-- | Convert an account name to a regular expression matching it but not its subaccounts, +-- case insensitively. +accountNameToAccountOnlyRegexCI :: AccountName -> Regexp +accountNameToAccountOnlyRegexCI a = toRegexCI' $ '^' : escapeName a ++ "$" -- PARTIAL: Is this safe after escapeName? + -- -- | Does this string look like an exact account-matching regular expression ? --isAccountRegex :: String -> Bool --isAccountRegex s = take 1 s == "^" && take 5 (reverse s) == ")$|:(" diff --git a/hledger-lib/Hledger/Data/Journal.hs b/hledger-lib/Hledger/Data/Journal.hs index 61e14d991..34af2be39 100644 --- a/hledger-lib/Hledger/Data/Journal.hs +++ b/hledger-lib/Hledger/Data/Journal.hs @@ -300,7 +300,7 @@ journalAccountNameTree = accountNameTreeFrom . journalAccountNames -- or otherwise for accounts with names matched by the case-insensitive -- regular expression @^assets?(:|$)@. journalAssetAccountQuery :: Journal -> Query -journalAssetAccountQuery = journalAccountTypeQuery [Asset,Cash] (toRegex' "^assets?(:|$)") +journalAssetAccountQuery = journalAccountTypeQuery [Asset,Cash] (toRegexCI' "^assets?(:|$)") -- | A query for "Cash" (liquid asset) accounts in this journal, ie accounts -- declared as Cash by account directives, or otherwise with names matched by the @@ -309,7 +309,7 @@ journalAssetAccountQuery = journalAccountTypeQuery [Asset,Cash] (toRegex' "^asse journalCashAccountQuery :: Journal -> Query journalCashAccountQuery j = case M.lookup Cash (jdeclaredaccounttypes j) of - Nothing -> And [ journalAssetAccountQuery j, Not . Acct $ toRegex' "(investment|receivable|:A/R|:fixed)" ] + Nothing -> And [ journalAssetAccountQuery j, Not . Acct $ toRegexCI' "(investment|receivable|:A/R|:fixed)" ] Just _ -> journalAccountTypeQuery [Cash] notused j where notused = error' "journalCashAccountQuery: this should not have happened!" -- PARTIAL: @@ -318,28 +318,28 @@ journalCashAccountQuery j = -- accounts with names matched by the case-insensitive regular expression -- @^(debts?|liabilit(y|ies))(:|$)@. journalLiabilityAccountQuery :: Journal -> Query -journalLiabilityAccountQuery = journalAccountTypeQuery [Liability] (toRegex' "^(debts?|liabilit(y|ies))(:|$)") +journalLiabilityAccountQuery = journalAccountTypeQuery [Liability] (toRegexCI' "^(debts?|liabilit(y|ies))(:|$)") -- | A query for accounts in this journal which have been -- declared as Equity by account directives, or otherwise for -- accounts with names matched by the case-insensitive regular expression -- @^equity(:|$)@. journalEquityAccountQuery :: Journal -> Query -journalEquityAccountQuery = journalAccountTypeQuery [Equity] (toRegex' "^equity(:|$)") +journalEquityAccountQuery = journalAccountTypeQuery [Equity] (toRegexCI' "^equity(:|$)") -- | A query for accounts in this journal which have been -- declared as Revenue by account directives, or otherwise for -- accounts with names matched by the case-insensitive regular expression -- @^(income|revenue)s?(:|$)@. journalRevenueAccountQuery :: Journal -> Query -journalRevenueAccountQuery = journalAccountTypeQuery [Revenue] (toRegex' "^(income|revenue)s?(:|$)") +journalRevenueAccountQuery = journalAccountTypeQuery [Revenue] (toRegexCI' "^(income|revenue)s?(:|$)") -- | A query for accounts in this journal which have been -- declared as Expense by account directives, or otherwise for -- accounts with names matched by the case-insensitive regular expression -- @^expenses?(:|$)@. journalExpenseAccountQuery :: Journal -> Query -journalExpenseAccountQuery = journalAccountTypeQuery [Expense] (toRegex' "^expenses?(:|$)") +journalExpenseAccountQuery = journalAccountTypeQuery [Expense] (toRegexCI' "^expenses?(:|$)") -- | A query for Asset, Liability & Equity accounts in this journal. -- Cf . diff --git a/tests/balancesheet.test b/tests/balancesheet.test index a9d323afc..ef1bf0c93 100644 --- a/tests/balancesheet.test +++ b/tests/balancesheet.test @@ -1,4 +1,5 @@ -# 1. trivial balance sheet +# 1. A trivial balance sheet. With no accounts of type Asset declared, +# a top-level "assets" account is autodetected as an Asset. < 2016/1/1 assets 1 @@ -21,7 +22,30 @@ Balance Sheet 2016-01-01 =============++============ Net: || 1 -# 2. monthly balance sheet, normal positive sign +# 2. Account type autodetection is case insensitive. +< +2016/1/1 + ASSETS 1 + b +$ hledger -f - balancesheet +Balance Sheet 2016-01-01 + + || 2016-01-01 +=============++============ + Assets || +-------------++------------ + ASSETS || 1 +-------------++------------ + || 1 +=============++============ + Liabilities || +-------------++------------ +-------------++------------ + || +=============++============ + Net: || 1 + +# 3. monthly balance sheet, normal positive sign # old (arithmetic sign): #Balance Sheet # @@ -64,7 +88,7 @@ Balance Sheet 2008-01-31..2008-12-31 ======================++================================================================================================================================================ Net: || $1 $1 $1 $1 $1 0 0 0 0 0 0 0 -# 3. monthly balance sheet in tree mode +# 4. monthly balance sheet in tree mode # old (arithmetic sign): # || 2008/01/31 2008/02/29 2008/03/31 2008/04/30 2008/05/31 2008/06/30 2008/07/31 2008/08/31 2008/09/30 2008/10/31 2008/11/30 2008/12/31 #==============++================================================================================================================================================ @@ -110,7 +134,7 @@ Balance Sheet 2008-01-31..2008-12-31 ===================++================================================================================================================================================ Net: || $1 $1 $1 $1 $1 0 0 0 0 0 0 0 -# 4. monthly balancesheet with average column and without overall totals row. +# 5. monthly balancesheet with average column and without overall totals row. # Total column is requested but not shown because balancesheet is in historical mode # by default (shows ending balances). $ hledger -f sample.journal balancesheet -p 'monthly in 2008' -NAT @@ -128,7 +152,7 @@ Balance Sheet 2008-01-31..2008-12-31 ----------------------++--------------------------------------------------------------------------------------------------------------------------------------------------------- liabilities:debts || 0 0 0 0 0 0 0 0 0 0 0 $-1 0 -# 5. Tree output still works, #565 +# 6. Tree output still works, #565 < 2017/1/1 (assets:b) 1 @@ -150,7 +174,7 @@ Balance Sheet 2017-01-01 =============++============ Net: || 1 -# 6. Flat output still works, #552 +# 7. Flat output still works, #552 < 2017/1/1 (assets:b) 1 @@ -172,7 +196,7 @@ Balance Sheet 2017-01-01 =============++============ Net: || 1 -# 7. An empty section does not disrupt the overall totals, #588 +# 8. An empty section does not disrupt the overall totals, #588 < 2017/1/1 (assets) $1 @@ -194,7 +218,7 @@ Balance Sheet 2017-12-31 =============++===================== Net: || $1 $1 -# 8. --pretty-tables uses unicode chars for borders +# 9. --pretty-tables uses unicode chars for borders < 2016/1/1 assets 1 @@ -217,7 +241,7 @@ Balance Sheet 2016-01-31 ═════════════╬════════════ Net: ║ 1 -# 9. Check that accounts brought to zero by subaccount balances +# 10. Check that accounts brought to zero by subaccount balances # are not erased from balancesheet < 2018-10-01 @@ -255,7 +279,7 @@ Balance Sheet 2018-10-03 =====================================++============ Net: || $120 -# 10. Check that starting balances are also filtered by subreport query. (See issue #1335) +# 11. Check that starting balances are also filtered by subreport query. (See issue #1335) < 2020-03-01 * Rent assets:a -$1