make account type autodetection (& hledger-smooth) case insensitive again (#1341)
lib: added case-insensitive variants of the accountNameToRegex functions.
This commit is contained in:
		
							parent
							
								
									a229b658e8
								
							
						
					
					
						commit
						c2929939e4
					
				| @ -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) | ||||||
|  | |||||||
| @ -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) == ")$|:(" | ||||||
|  | |||||||
| @ -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>. | ||||||
|  | |||||||
| @ -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 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user