make account type autodetection (& hledger-smooth) case insensitive again (#1341)

lib: added case-insensitive variants of the accountNameToRegex functions.
This commit is contained in:
Simon Michael 2020-09-03 09:48:50 -07:00
parent a229b658e8
commit c2929939e4
4 changed files with 53 additions and 17 deletions

View File

@ -66,7 +66,7 @@ main = do
args = words' $ query_ ropts args = words' $ query_ ropts
q = queryFromOpts today ropts q = queryFromOpts today ropts
acct = T.pack $ headDef (error' "Please provide an account name argument") args 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) -- dates of postings to acct (in report)
pdates = map (postingDate . fourth5) (snd pr) pdates = map (postingDate . fourth5) (snd pr)

View File

@ -16,7 +16,9 @@ module Hledger.Data.AccountName (
,accountNameFromComponents ,accountNameFromComponents
,accountNameLevel ,accountNameLevel
,accountNameToAccountOnlyRegex ,accountNameToAccountOnlyRegex
,accountNameToAccountOnlyRegexCI
,accountNameToAccountRegex ,accountNameToAccountRegex
,accountNameToAccountRegexCI
,accountNameTreeFrom ,accountNameTreeFrom
,accountSummarisedName ,accountSummarisedName
,acctsep ,acctsep
@ -218,10 +220,20 @@ escapeName = T.unpack . T.concatMap escapeChar
accountNameToAccountRegex :: AccountName -> Regexp accountNameToAccountRegex :: AccountName -> Regexp
accountNameToAccountRegex a = toRegex' $ '^' : escapeName a ++ "(:|$)" -- PARTIAL: Is this safe after escapeName? 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. -- | Convert an account name to a regular expression matching it but not its subaccounts.
accountNameToAccountOnlyRegex :: AccountName -> Regexp accountNameToAccountOnlyRegex :: AccountName -> Regexp
accountNameToAccountOnlyRegex a = toRegex' $ '^' : escapeName a ++ "$" -- PARTIAL: Is this safe after escapeName? 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 ? -- -- | Does this string look like an exact account-matching regular expression ?
--isAccountRegex :: String -> Bool --isAccountRegex :: String -> Bool
--isAccountRegex s = take 1 s == "^" && take 5 (reverse s) == ")$|:(" --isAccountRegex s = take 1 s == "^" && take 5 (reverse s) == ")$|:("

View File

@ -300,7 +300,7 @@ journalAccountNameTree = accountNameTreeFrom . journalAccountNames
-- or otherwise for accounts with names matched by the case-insensitive -- or otherwise for accounts with names matched by the case-insensitive
-- regular expression @^assets?(:|$)@. -- regular expression @^assets?(:|$)@.
journalAssetAccountQuery :: Journal -> Query 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 -- | 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 -- 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 :: Journal -> Query
journalCashAccountQuery j = journalCashAccountQuery j =
case M.lookup Cash (jdeclaredaccounttypes j) of 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 Just _ -> journalAccountTypeQuery [Cash] notused j
where notused = error' "journalCashAccountQuery: this should not have happened!" -- PARTIAL: 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 -- accounts with names matched by the case-insensitive regular expression
-- @^(debts?|liabilit(y|ies))(:|$)@. -- @^(debts?|liabilit(y|ies))(:|$)@.
journalLiabilityAccountQuery :: Journal -> Query 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 -- | A query for accounts in this journal which have been
-- declared as Equity by account directives, or otherwise for -- declared as Equity by account directives, or otherwise for
-- accounts with names matched by the case-insensitive regular expression -- accounts with names matched by the case-insensitive regular expression
-- @^equity(:|$)@. -- @^equity(:|$)@.
journalEquityAccountQuery :: Journal -> Query journalEquityAccountQuery :: Journal -> Query
journalEquityAccountQuery = journalAccountTypeQuery [Equity] (toRegex' "^equity(:|$)") journalEquityAccountQuery = journalAccountTypeQuery [Equity] (toRegexCI' "^equity(:|$)")
-- | A query for accounts in this journal which have been -- | A query for accounts in this journal which have been
-- declared as Revenue by account directives, or otherwise for -- declared as Revenue by account directives, or otherwise for
-- accounts with names matched by the case-insensitive regular expression -- accounts with names matched by the case-insensitive regular expression
-- @^(income|revenue)s?(:|$)@. -- @^(income|revenue)s?(:|$)@.
journalRevenueAccountQuery :: Journal -> Query 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 -- | A query for accounts in this journal which have been
-- declared as Expense by account directives, or otherwise for -- declared as Expense by account directives, or otherwise for
-- accounts with names matched by the case-insensitive regular expression -- accounts with names matched by the case-insensitive regular expression
-- @^expenses?(:|$)@. -- @^expenses?(:|$)@.
journalExpenseAccountQuery :: Journal -> Query journalExpenseAccountQuery :: Journal -> Query
journalExpenseAccountQuery = journalAccountTypeQuery [Expense] (toRegex' "^expenses?(:|$)") journalExpenseAccountQuery = journalAccountTypeQuery [Expense] (toRegexCI' "^expenses?(:|$)")
-- | A query for Asset, Liability & Equity accounts in this journal. -- | A query for Asset, Liability & Equity accounts in this journal.
-- Cf <http://en.wikipedia.org/wiki/Chart_of_accounts#Balance_Sheet_Accounts>. -- Cf <http://en.wikipedia.org/wiki/Chart_of_accounts#Balance_Sheet_Accounts>.

View File

@ -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 2016/1/1
assets 1 assets 1
@ -21,7 +22,30 @@ Balance Sheet 2016-01-01
=============++============ =============++============
Net: || 1 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): # old (arithmetic sign):
#Balance Sheet #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 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): # 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 # || 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 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 # Total column is requested but not shown because balancesheet is in historical mode
# by default (shows ending balances). # by default (shows ending balances).
$ hledger -f sample.journal balancesheet -p 'monthly in 2008' -NAT $ 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 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 2017/1/1
(assets:b) 1 (assets:b) 1
@ -150,7 +174,7 @@ Balance Sheet 2017-01-01
=============++============ =============++============
Net: || 1 Net: || 1
# 6. Flat output still works, #552 # 7. Flat output still works, #552
< <
2017/1/1 2017/1/1
(assets:b) 1 (assets:b) 1
@ -172,7 +196,7 @@ Balance Sheet 2017-01-01
=============++============ =============++============
Net: || 1 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 2017/1/1
(assets) $1 (assets) $1
@ -194,7 +218,7 @@ Balance Sheet 2017-12-31
=============++===================== =============++=====================
Net: || $1 $1 Net: || $1 $1
# 8. --pretty-tables uses unicode chars for borders # 9. --pretty-tables uses unicode chars for borders
< <
2016/1/1 2016/1/1
assets 1 assets 1
@ -217,7 +241,7 @@ Balance Sheet 2016-01-31
═════════════╬════════════ ═════════════╬════════════
Net: ║ 1 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 # are not erased from balancesheet
< <
2018-10-01 2018-10-01
@ -255,7 +279,7 @@ Balance Sheet 2018-10-03
=====================================++============ =====================================++============
Net: || $120 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 2020-03-01 * Rent
assets:a -$1 assets:a -$1