refactor IOArgs -> FilterSpec and make haddock happy
This commit is contained in:
		
							parent
							
								
									a8bfb06da4
								
							
						
					
					
						commit
						6fb1804cfd
					
				
							
								
								
									
										44
									
								
								Ledger/IO.hs
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								Ledger/IO.hs
									
									
									
									
									
								
							| @ -8,7 +8,7 @@ import Control.Monad.Error | ||||
| import Ledger.Ledger (cacheLedger) | ||||
| import Ledger.Parse (parseLedger) | ||||
| import Ledger.RawLedger (canonicaliseAmounts,filterRawLedger,rawLedgerSelectingDate) | ||||
| import Ledger.Types (WhichDate(..),DateSpan(..),RawLedger(..),Ledger(..)) | ||||
| import Ledger.Types (FilterSpec(..),WhichDate(..),DateSpan(..),RawLedger(..),Ledger(..)) | ||||
| import Ledger.Utils (getCurrentLocalTime) | ||||
| import System.Directory (getHomeDirectory) | ||||
| import System.Environment (getEnv) | ||||
| @ -21,17 +21,15 @@ timelogenvvar          = "TIMELOG" | ||||
| ledgerdefaultfilename  = ".ledger" | ||||
| timelogdefaultfilename = ".timelog" | ||||
| 
 | ||||
| -- | A tuple of arguments specifying how to filter a raw ledger file. | ||||
| type IOArgs = (DateSpan   -- ^ only include transactions in this date span | ||||
|               ,Maybe Bool -- ^ only include if cleared\/uncleared\/don't care | ||||
|               ,Bool       -- ^ only include if real\/don't care | ||||
|               ,Bool       -- ^ convert all amounts to cost basis | ||||
|               ,[String]   -- ^ only include if matching these account patterns | ||||
|               ,[String]   -- ^ only include if matching these description patterns | ||||
|               ,WhichDate  -- ^ which dates to use (transaction or effective) | ||||
|               ) | ||||
| 
 | ||||
| noioargs = (DateSpan Nothing Nothing, Nothing, False, False, [], [], ActualDate) | ||||
| nullfilterspec = FilterSpec { | ||||
|                   datespan=DateSpan Nothing Nothing | ||||
|                  ,cleared=Nothing | ||||
|                  ,real=False | ||||
|                  ,costbasis=False | ||||
|                  ,acctpats=[] | ||||
|                  ,descpats=[] | ||||
|                  ,whichdate=ActualDate | ||||
|                  } | ||||
| 
 | ||||
| -- | Get the user's default ledger file path. | ||||
| myLedgerPath :: IO String | ||||
| @ -59,15 +57,15 @@ myTimelog = myTimelogPath >>= readLedger | ||||
| 
 | ||||
| -- | Read a ledger from this file, with no filtering, or give an error. | ||||
| readLedger :: FilePath -> IO Ledger | ||||
| readLedger = readLedgerWithIOArgs noioargs | ||||
| readLedger = readLedgerWithFilterSpec nullfilterspec | ||||
| 
 | ||||
| -- | Read a ledger from this file, filtering according to the io args, | ||||
| -- | Read a ledger from this file, filtering according to the filter spec., | ||||
| -- | or give an error. | ||||
| readLedgerWithIOArgs :: IOArgs -> FilePath -> IO Ledger | ||||
| readLedgerWithIOArgs ioargs f = do | ||||
| readLedgerWithFilterSpec :: FilterSpec -> FilePath -> IO Ledger | ||||
| readLedgerWithFilterSpec fspec f = do | ||||
|   s <- readFile f  | ||||
|   rl <- rawLedgerFromString s | ||||
|   return $ filterAndCacheLedger ioargs s rl | ||||
|   return $ filterAndCacheLedger fspec s rl | ||||
| 
 | ||||
| -- | Read a RawLedger from the given string, using the current time as | ||||
| -- reference time, or give a parse error. | ||||
| @ -77,10 +75,14 @@ rawLedgerFromString s = do | ||||
|   liftM (either error id) $ runErrorT $ parseLedger t "(string)" s | ||||
| 
 | ||||
| -- | Convert a RawLedger to a canonicalised, cached and filtered Ledger. | ||||
| filterAndCacheLedger :: IOArgs -> String -> RawLedger -> Ledger | ||||
| filterAndCacheLedger (span,cleared,real,costbasis,apats,dpats,whichdate) rawtext rl =  | ||||
|     (cacheLedger apats  | ||||
|     $ filterRawLedger span dpats cleared real  | ||||
| filterAndCacheLedger :: FilterSpec -> String -> RawLedger -> Ledger | ||||
| filterAndCacheLedger (FilterSpec{datespan=datespan,cleared=cleared,real=real, | ||||
|                                  costbasis=costbasis,acctpats=acctpats, | ||||
|                                  descpats=descpats,whichdate=whichdate}) | ||||
|                      rawtext | ||||
|                      rl =  | ||||
|     (cacheLedger acctpats  | ||||
|     $ filterRawLedger datespan descpats cleared real  | ||||
|     $ rawLedgerSelectingDate whichdate | ||||
|     $ canonicaliseAmounts costbasis rl | ||||
|     ){rawledgertext=rawtext} | ||||
|  | ||||
| @ -39,7 +39,7 @@ aliases for easier interaction. Here's an example: | ||||
| > Node {rootLabel = Account top with 0 txns and 0 balance, subForest = [... | ||||
| > > accounttreeat l (account l "assets") | ||||
| > Just (Node {rootLabel = Account assets with 0 txns and $-1 balance, ... | ||||
| > > datespan l | ||||
| > > datespan l -- disabled | ||||
| > DateSpan (Just 2008-01-01) (Just 2009-01-01) | ||||
| > > rawdatespan l | ||||
| > DateSpan (Just 2008-01-01) (Just 2009-01-01) | ||||
| @ -206,8 +206,8 @@ accounttree = ledgerAccountTree | ||||
| accounttreeat :: Ledger -> Account -> Maybe (Tree Account) | ||||
| accounttreeat = ledgerAccountTreeAt | ||||
| 
 | ||||
| datespan :: Ledger -> DateSpan | ||||
| datespan = ledgerDateSpan | ||||
| -- datespan :: Ledger -> DateSpan | ||||
| -- datespan = ledgerDateSpan | ||||
| 
 | ||||
| rawdatespan :: Ledger -> DateSpan | ||||
| rawdatespan = rawLedgerDateSpan . rawledger | ||||
|  | ||||
| @ -115,6 +115,17 @@ data RawLedger = RawLedger { | ||||
|       filepath :: FilePath | ||||
|     } deriving (Eq) | ||||
| 
 | ||||
| -- | A generic, pure specification of how to filter raw ledger transactions. | ||||
| data FilterSpec = FilterSpec { | ||||
|      datespan  :: DateSpan   -- ^ only include transactions in this date span | ||||
|     ,cleared   :: Maybe Bool -- ^ only include if cleared\/uncleared\/don't care | ||||
|     ,real      :: Bool       -- ^ only include if real\/don't care | ||||
|     ,costbasis :: Bool       -- ^ convert all amounts to cost basis | ||||
|     ,acctpats  :: [String]   -- ^ only include if matching these account patterns | ||||
|     ,descpats  :: [String]   -- ^ only include if matching these description patterns | ||||
|     ,whichdate :: WhichDate  -- ^ which dates to use (transaction or effective) | ||||
|     } | ||||
| 
 | ||||
| data Transaction = Transaction { | ||||
|       tnum :: Int, | ||||
|       tstatus :: Bool,           -- ^ posting status | ||||
|  | ||||
							
								
								
									
										28
									
								
								Options.hs
									
									
									
									
									
								
							
							
						
						
									
										28
									
								
								Options.hs
									
									
									
									
									
								
							| @ -7,7 +7,7 @@ module Options | ||||
| where | ||||
| import System.Console.GetOpt | ||||
| import System.Environment | ||||
| import Ledger.IO (IOArgs,myLedgerPath,myTimelogPath) | ||||
| import Ledger.IO (myLedgerPath,myTimelogPath) | ||||
| import Ledger.Utils | ||||
| import Ledger.Types | ||||
| import Ledger.Dates | ||||
| @ -229,16 +229,18 @@ parsePatternArgs args = (as, ds') | ||||
|       (ds, as) = partition (descprefix `isPrefixOf`) args | ||||
|       ds' = map (drop (length descprefix)) ds | ||||
| 
 | ||||
| -- | Convert application options to more generic types for the library. | ||||
| optsToIOArgs :: [Opt] -> [String] -> LocalTime -> IOArgs | ||||
| optsToIOArgs opts args t = (dateSpanFromOpts (localDay t) opts | ||||
|                          ,clearedValueFromOpts opts | ||||
|                          ,Real `elem` opts | ||||
|                          ,CostBasis `elem` opts | ||||
|                          ,apats | ||||
|                          ,dpats | ||||
|                          ,case Effective `elem` opts of | ||||
|                             True -> EffectiveDate | ||||
|                             _    -> ActualDate | ||||
|                          ) where (apats,dpats) = parsePatternArgs args | ||||
| -- | Convert application options to the library's generic filter specification. | ||||
| optsToFilterSpec :: [Opt] -> [String] -> LocalTime -> FilterSpec | ||||
| optsToFilterSpec opts args t = FilterSpec { | ||||
|                                 datespan=dateSpanFromOpts (localDay t) opts | ||||
|                                ,cleared=clearedValueFromOpts opts | ||||
|                                ,real=Real `elem` opts | ||||
|                                ,costbasis=CostBasis `elem` opts | ||||
|                                ,acctpats=apats | ||||
|                                ,descpats=dpats | ||||
|                                ,whichdate=case Effective `elem` opts of | ||||
|                                             True -> EffectiveDate | ||||
|                                             _    -> ActualDate | ||||
|                                } | ||||
|     where (apats,dpats) = parsePatternArgs args | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										6
									
								
								Utils.hs
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								Utils.hs
									
									
									
									
									
								
							| @ -9,7 +9,7 @@ module Utils | ||||
| where | ||||
| import Control.Monad.Error | ||||
| import Ledger | ||||
| import Options (Opt,ledgerFilePathFromOpts,optsToIOArgs) | ||||
| import Options (Opt,ledgerFilePathFromOpts,optsToFilterSpec) | ||||
| import System.Directory (doesFileExist) | ||||
| import System.IO | ||||
| 
 | ||||
| @ -42,10 +42,10 @@ ledgerFromStringWithOpts opts args reftime s = | ||||
| readLedgerWithOpts :: [Opt] -> [String] -> FilePath -> IO Ledger | ||||
| readLedgerWithOpts opts args f = do | ||||
|   t <- getCurrentLocalTime | ||||
|   readLedgerWithIOArgs (optsToIOArgs opts args t) f | ||||
|   readLedgerWithFilterSpec (optsToFilterSpec opts args t) f | ||||
|             | ||||
| -- | Convert a RawLedger to a canonicalised, cached and filtered Ledger | ||||
| -- based on the command-line options/arguments and a reference time. | ||||
| filterAndCacheLedgerWithOpts ::  [Opt] -> [String] -> LocalTime -> String -> RawLedger -> Ledger | ||||
| filterAndCacheLedgerWithOpts opts args t = filterAndCacheLedger (optsToIOArgs opts args t) | ||||
| filterAndCacheLedgerWithOpts opts args t = filterAndCacheLedger (optsToFilterSpec opts args t) | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user