cli: make check-dupes a builtin command
This commit is contained in:
		
							parent
							
								
									44e3d72926
								
							
						
					
					
						commit
						fe9cd2a186
					
				| @ -1,59 +0,0 @@ | |||||||
| #!/usr/bin/env stack |  | ||||||
| {- stack runghc --verbosity info |  | ||||||
|    --package hledger-lib |  | ||||||
|    --package hledger |  | ||||||
|    --package here |  | ||||||
|    --package text |  | ||||||
| -} |  | ||||||
| 
 |  | ||||||
| {-# OPTIONS_GHC -Wno-missing-signatures -Wno-name-shadowing #-} |  | ||||||
| {-# LANGUAGE QuasiQuotes #-} |  | ||||||
| 
 |  | ||||||
| import Hledger |  | ||||||
| import Hledger.Cli |  | ||||||
| import Text.Printf (printf) |  | ||||||
| -- import System.Environment (getArgs) |  | ||||||
| import Data.List |  | ||||||
| import Data.Function |  | ||||||
| import Data.String.Here |  | ||||||
| import qualified Data.Text as T |  | ||||||
| 
 |  | ||||||
| ------------------------------------------------------------------------------ |  | ||||||
| cmdmode = hledgerCommandMode |  | ||||||
|   [here| check-dupes |  | ||||||
| Reports duplicates in the account tree: account names having the same leaf |  | ||||||
| but different prefixes. In other words, two or more leaves that are |  | ||||||
| categorized differently. |  | ||||||
| Reads the default journal file, or another specified as an argument. |  | ||||||
|   |  | ||||||
| http://stefanorodighiero.net/software/hledger-dupes.html |  | ||||||
|   |] |  | ||||||
|   [] |  | ||||||
|   [generalflagsgroup1] |  | ||||||
|   [] |  | ||||||
|   ([], Nothing) |  | ||||||
| ------------------------------------------------------------------------------ |  | ||||||
| 
 |  | ||||||
| main = do |  | ||||||
|   opts <- getHledgerCliOpts cmdmode |  | ||||||
|   withJournalDo opts $ \CliOpts{rawopts_=_opts,reportopts_=_ropts} j -> do |  | ||||||
|     mapM_ render $ checkdupes $ accountsNames j |  | ||||||
| 
 |  | ||||||
| accountsNames :: Journal -> [(String, AccountName)] |  | ||||||
| accountsNames j = map leafAndAccountName as |  | ||||||
|   where leafAndAccountName a = (T.unpack $ accountLeafName a, a) |  | ||||||
|         ps = journalPostings j |  | ||||||
|         as = nub $ sort $ map paccount ps |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| checkdupes :: (Ord k, Eq k) => [(k, v)] -> [(k, [v])] |  | ||||||
| checkdupes l = zip dupLeafs dupAccountNames |  | ||||||
|   where dupLeafs = map (fst . head) d |  | ||||||
|         dupAccountNames = map (map snd) d |  | ||||||
|         d = dupes' l |  | ||||||
|         dupes' = filter ((> 1) . length) |  | ||||||
|           . groupBy ((==) `on` fst) |  | ||||||
|           . sortBy (compare `on` fst) |  | ||||||
| 
 |  | ||||||
| render :: (String, [AccountName]) -> IO () |  | ||||||
| render (leafName, accountNameL) = printf "%s as %s\n" leafName (concat $ intersperse ", " (map T.unpack accountNameL)) |  | ||||||
| @ -19,6 +19,7 @@ module Hledger.Cli.Commands ( | |||||||
|   ,module Hledger.Cli.Commands.Balancesheetequity |   ,module Hledger.Cli.Commands.Balancesheetequity | ||||||
|   ,module Hledger.Cli.Commands.Cashflow |   ,module Hledger.Cli.Commands.Cashflow | ||||||
|   ,module Hledger.Cli.Commands.Checkdates |   ,module Hledger.Cli.Commands.Checkdates | ||||||
|  |   ,module Hledger.Cli.Commands.Checkdupes | ||||||
|   ,module Hledger.Cli.Commands.Help |   ,module Hledger.Cli.Commands.Help | ||||||
|   ,module Hledger.Cli.Commands.Incomestatement |   ,module Hledger.Cli.Commands.Incomestatement | ||||||
|   ,module Hledger.Cli.Commands.Print |   ,module Hledger.Cli.Commands.Print | ||||||
| @ -49,6 +50,7 @@ import Hledger.Cli.Commands.Balancesheet | |||||||
| import Hledger.Cli.Commands.Balancesheetequity | import Hledger.Cli.Commands.Balancesheetequity | ||||||
| import Hledger.Cli.Commands.Cashflow | import Hledger.Cli.Commands.Cashflow | ||||||
| import Hledger.Cli.Commands.Checkdates | import Hledger.Cli.Commands.Checkdates | ||||||
|  | import Hledger.Cli.Commands.Checkdupes | ||||||
| import Hledger.Cli.Commands.Help | import Hledger.Cli.Commands.Help | ||||||
| import Hledger.Cli.Commands.Incomestatement | import Hledger.Cli.Commands.Incomestatement | ||||||
| import Hledger.Cli.Commands.Print | import Hledger.Cli.Commands.Print | ||||||
|  | |||||||
							
								
								
									
										49
									
								
								hledger/Hledger/Cli/Commands/Checkdupes.hs
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										49
									
								
								hledger/Hledger/Cli/Commands/Checkdupes.hs
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,49 @@ | |||||||
|  | {-# LANGUAGE QuasiQuotes #-} | ||||||
|  | 
 | ||||||
|  | module Hledger.Cli.Commands.Checkdupes ( | ||||||
|  |   checkdupesmode | ||||||
|  |  ,checkdupes | ||||||
|  | )  | ||||||
|  | where | ||||||
|  | 
 | ||||||
|  | import Data.Function | ||||||
|  | import Data.List | ||||||
|  | import Data.String.Here | ||||||
|  | import qualified Data.Text as T | ||||||
|  | import Hledger | ||||||
|  | import Hledger.Cli.CliOptions | ||||||
|  | import System.Console.CmdArgs.Explicit | ||||||
|  | import Text.Printf | ||||||
|  | 
 | ||||||
|  | checkdupesmode :: Mode RawOpts | ||||||
|  | checkdupesmode = hledgerCommandMode | ||||||
|  |   [here| check-dupes | ||||||
|  | Reports account names having the same leaf but different prefixes.  | ||||||
|  | In other words, two or more leaves that are categorized differently. | ||||||
|  | Reads the default journal file, or another specified as an argument. | ||||||
|  | An example: http://stefanorodighiero.net/software/hledger-dupes.html | ||||||
|  |   |] | ||||||
|  |   [] | ||||||
|  |   [generalflagsgroup1] | ||||||
|  |   [] | ||||||
|  |   ([], Nothing) | ||||||
|  | 
 | ||||||
|  | checkdupes _opts j = mapM_ render $ checkdupes' $ accountsNames j | ||||||
|  | 
 | ||||||
|  | accountsNames :: Journal -> [(String, AccountName)] | ||||||
|  | accountsNames j = map leafAndAccountName as | ||||||
|  |   where leafAndAccountName a = (T.unpack $ accountLeafName a, a) | ||||||
|  |         ps = journalPostings j | ||||||
|  |         as = nub $ sort $ map paccount ps | ||||||
|  | 
 | ||||||
|  | checkdupes' :: (Ord k, Eq k) => [(k, v)] -> [(k, [v])] | ||||||
|  | checkdupes' l = zip dupLeafs dupAccountNames | ||||||
|  |   where dupLeafs = map (fst . head) d | ||||||
|  |         dupAccountNames = map (map snd) d | ||||||
|  |         d = dupes' l | ||||||
|  |         dupes' = filter ((> 1) . length) | ||||||
|  |           . groupBy ((==) `on` fst) | ||||||
|  |           . sortBy (compare `on` fst) | ||||||
|  | 
 | ||||||
|  | render :: (String, [AccountName]) -> IO () | ||||||
|  | render (leafName, accountNameL) = printf "%s as %s\n" leafName (concat $ intersperse ", " (map T.unpack accountNameL)) | ||||||
| @ -89,11 +89,6 @@ is an old pie chart generator, in need of some love. | |||||||
| [hledger-check.hs](https://github.com/simonmichael/hledger/blob/master/bin/hledger-check.hs) | [hledger-check.hs](https://github.com/simonmichael/hledger/blob/master/bin/hledger-check.hs) | ||||||
| checks more powerful account balance assertions. | checks more powerful account balance assertions. | ||||||
| 
 | 
 | ||||||
| ### check-dupes |  | ||||||
| 
 |  | ||||||
| [hledger-check-dupes.hs](https://github.com/simonmichael/hledger/blob/master/bin/hledger-check-dupes.hs#L21) |  | ||||||
| checks for account names sharing the same leaf name. |  | ||||||
| 
 |  | ||||||
| ### equity | ### equity | ||||||
| 
 | 
 | ||||||
| [hledger-equity.hs](https://github.com/simonmichael/hledger/blob/master/bin/hledger-equity.hs#L17) | [hledger-equity.hs](https://github.com/simonmichael/hledger/blob/master/bin/hledger-equity.hs#L17) | ||||||
|  | |||||||
| @ -345,6 +345,10 @@ you can alter the report mode with `--change`/`--cumulative`/`--historical`. | |||||||
| Check that transactions are sorted by increasing date. | Check that transactions are sorted by increasing date. | ||||||
| With a query, only matched transactions' dates are checked. | With a query, only matched transactions' dates are checked. | ||||||
| 
 | 
 | ||||||
|  | ## check-dupes | ||||||
|  | Reports account names having the same leaf but different prefixes.  | ||||||
|  | An example: http://stefanorodighiero.net/software/hledger-dupes.html | ||||||
|  | 
 | ||||||
| ## help | ## help | ||||||
| Show any of the hledger manuals. | Show any of the hledger manuals. | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -130,6 +130,7 @@ library | |||||||
|       Hledger.Cli.Commands.Balancesheetequity |       Hledger.Cli.Commands.Balancesheetequity | ||||||
|       Hledger.Cli.Commands.Cashflow |       Hledger.Cli.Commands.Cashflow | ||||||
|       Hledger.Cli.Commands.Checkdates |       Hledger.Cli.Commands.Checkdates | ||||||
|  |       Hledger.Cli.Commands.Checkdupes | ||||||
|       Hledger.Cli.Commands.Help |       Hledger.Cli.Commands.Help | ||||||
|       Hledger.Cli.Commands.Incomestatement |       Hledger.Cli.Commands.Incomestatement | ||||||
|       Hledger.Cli.Commands.Print |       Hledger.Cli.Commands.Print | ||||||
|  | |||||||
| @ -111,6 +111,7 @@ library: | |||||||
|   - Hledger.Cli.Commands.Balancesheetequity |   - Hledger.Cli.Commands.Balancesheetequity | ||||||
|   - Hledger.Cli.Commands.Cashflow |   - Hledger.Cli.Commands.Cashflow | ||||||
|   - Hledger.Cli.Commands.Checkdates |   - Hledger.Cli.Commands.Checkdates | ||||||
|  |   - Hledger.Cli.Commands.Checkdupes | ||||||
|   - Hledger.Cli.Commands.Help |   - Hledger.Cli.Commands.Help | ||||||
|   - Hledger.Cli.Commands.Incomestatement |   - Hledger.Cli.Commands.Incomestatement | ||||||
|   - Hledger.Cli.Commands.Print |   - Hledger.Cli.Commands.Print | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user