mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-08 07:09:28 +03:00
195 lines
8.2 KiB
Plaintext
195 lines
8.2 KiB
Plaintext
hledger project notes
|
||
|
||
* TO DO
|
||
** make balance fast
|
||
*** TODO optimise with CachedLedger
|
||
**** original
|
||
******** transactionsInAccountNamed Account 12 0.0 0.1 66.7 18.7
|
||
********* ledgerTransactionsMatching Ledger 24 0.0 8.4 66.7 18.6
|
||
********** matchTransactionDescription EntryTransaction 48 0.0 0.7 0.0 0.7
|
||
*********** description EntryTransaction 48 0.0 0.0 0.0 0.0
|
||
********** matchTransactionAccount EntryTransaction 864 66.7 7.3 66.7 7.3
|
||
*********** account EntryTransaction 864 0.0 0.0 0.0 0.0
|
||
**** cachedledger added
|
||
matchTransactionAccount EntryTransaction 619 86602 13.4 2.4 13.5 2.4
|
||
matchTransactionAccount EntryTransaction 558 91637 22.8 2.8 22.9 2.8
|
||
matchTransactionAccount EntryTransaction 520 91637 16.8 2.6 16.9 2.6
|
||
**** functions renamed
|
||
balance Main 334 1 0.0 0.0 99.6 97.4
|
||
showLedgerAccounts Ledger 460 1 0.0 0.0 99.6 97.3
|
||
showRawLedgerAccounts Account 461 1 0.1 0.0 99.6 97.3
|
||
showAccountTree Account 505 1 0.0 0.0 31.6 37.3
|
||
showAccountTree' Account 506 91 0.0 0.0 31.6 37.3
|
||
isBoringInnerAccountName Account 613 86 0.1 0.0 29.4 31.1
|
||
transactionsInAccountNamed Account 614 86 0.0 0.0 17.3 4.3
|
||
rawLedgerTransactionsMatching RawLedger 615 172 0.7 0.7 17.3 4.3
|
||
matchTransactionAccount EntryTransaction 619 86602 14.8 2.4 14.9 2.4
|
||
> rawLedgerAccountTreeMatching Account 463 2 0.0 0.0 67.9 60.0
|
||
> addDataToAccountNameTree Account 465 93 0.0 0.0 67.7 59.8
|
||
> rawLedgerAccount Account 512 92 0.0 0.0 67.7 59.8
|
||
> transactionsInAccountNamed Account 515 91 0.0 0.0 29.0 20.0
|
||
> rawLedgerTransactionsMatching RawLedger 516 182 3.6 13.9 29.0 20.0
|
||
> matchTransactionAccount EntryTransaction 520 91637 17.1 2.6 17.2 2.6
|
||
aggregateBalanceInAccountNamed Account 550 91 0.0 0.0 38.7 39.8
|
||
aggregateTransactionsInAccountNamed Account 553 91 0.0 0.0 38.7 39.8
|
||
rawLedgerTransactionsMatching RawLedger 554 182 7.3 32.8 38.7 39.7
|
||
matchTransactionAccount EntryTransaction 558 91637 22.6 2.8 22.8 2.8
|
||
|
||
1
|
||
showRawLedgerAccounts l acctpats showsubs maxdepth =
|
||
concatMap
|
||
(showAccountTree l)
|
||
(branches (rawLedgerAccountTreeMatching l acctpats showsubs maxdepth))
|
||
|
||
2
|
||
rawLedgerAccountTreeMatching l [] showsubs maxdepth =
|
||
rawLedgerAccountTreeMatching l [".*"] showsubs maxdepth
|
||
rawLedgerAccountTreeMatching l acctpats showsubs maxdepth =
|
||
addDataToAccountNameTree l $
|
||
filterAccountNameTree acctpats showsubs maxdepth $
|
||
rawLedgerAccountNameTree l
|
||
|
||
93
|
||
addDataToAccountNameTree l ant =
|
||
Node
|
||
(rawLedgerAccount l $ root ant)
|
||
(map (addDataToAccountNameTree l) $ branches ant)
|
||
|
||
92
|
||
rawLedgerAccount l a =
|
||
Account
|
||
a
|
||
(transactionsInAccountNamed l a)
|
||
(aggregateBalanceInAccountNamed l a)
|
||
|
||
91
|
||
transactionsInAccountNamed l a =
|
||
rawLedgerTransactionsMatching (["^" ++ a ++ "$"], []) l
|
||
|
||
182
|
||
rawLedgerTransactionsMatching ([],[]) l = rawLedgerTransactionsMatching ([".*"],[".*"]) l
|
||
rawLedgerTransactionsMatching (rs,[]) l = rawLedgerTransactionsMatching (rs,[".*"]) l
|
||
rawLedgerTransactionsMatching ([],rs) l = rawLedgerTransactionsMatching ([".*"],rs) l
|
||
rawLedgerTransactionsMatching (acctregexps,descregexps) l =
|
||
intersect
|
||
(concat [filter (matchTransactionAccount r) ts | r <- acctregexps])
|
||
(concat [filter (matchTransactionDescription r) ts | r <- descregexps])
|
||
where ts = rawLedgerTransactions l
|
||
|
||
91637
|
||
matchTransactionAccount s t =
|
||
case matchRegex (mkRegex s) (account t) of
|
||
Nothing -> False
|
||
otherwise -> True
|
||
|
||
**** begin optimisation
|
||
** make some decent tests
|
||
** bugs
|
||
*** space after account makes it a new account
|
||
*** extra blank line required at end of file
|
||
** basic features
|
||
*** print
|
||
*** !include
|
||
*** , in thousands
|
||
*** -j and -J graph data output
|
||
|
||
** advanced features
|
||
*** handle mixed amounts
|
||
*** 3.0-style elision
|
||
*** -p period expressions
|
||
*** -d display expressions
|
||
*** read gnucash files
|
||
*** other args, directives
|
||
|
||
** new features
|
||
*** feature: read timelog files
|
||
**** fix up Amounts
|
||
***** allow flexible display by currency
|
||
***** allow parsing by currency
|
||
***** fix arithmetic
|
||
|
||
**** timelog parser
|
||
handle time amounts
|
||
switch to Data.Time.*
|
||
fix errors
|
||
- read seconds to pico
|
||
try System.Time ?
|
||
|
||
*** timelog simple format
|
||
*** auto-generate missing clock-out
|
||
*** graph automation
|
||
*** entry and smart data entry
|
||
*** incorporate timeclock features
|
||
*** better layout
|
||
|
||
** testing
|
||
*** better use of quickcheck/smallcheck
|
||
http://blog.codersbase.com/2006/09/01/simple-unit-testing-in-haskell/
|
||
*** ledger compatibility tests
|
||
|
||
** documentation
|
||
*** literate docs
|
||
*** better use of haddock
|
||
|
||
** marketing
|
||
*** set up as a cabal/hackage project following wiki howto ?
|
||
http://en.wikibooks.org/wiki/Haskell/Packaging
|
||
*** announce on haskell list, wiki
|
||
|
||
|
||
* things I want to know
|
||
|
||
** time
|
||
|
||
where have I been spending my time in recent weeks ?
|
||
where have I spent my time today ?
|
||
what is my status wrt spending plan for this week/month/year ?
|
||
what is my current status wrt time spending goals ?
|
||
|
||
** money
|
||
|
||
where have I been spending my money ?
|
||
what is my status wrt spending plan for this week/month/year ?
|
||
what is my current status wrt spending/savings goals ?
|
||
what are all my current balances ?
|
||
what does my balance history look like ?
|
||
what does my balance future look like ?
|
||
are there any cashflow, tax, budgetary problems looming ?
|
||
|
||
* misc
|
||
** testing support
|
||
|
||
-- {- | looks in Tests.hs for functions like prop_foo and returns
|
||
-- the list. Requires that Tests.hs be valid Haskell98. -}
|
||
-- tests :: [String]
|
||
-- tests = unsafePerformIO $
|
||
-- do h <- openFile "src/Tests.hs" ReadMode
|
||
-- s <- hGetContents h
|
||
-- case parseModule s of
|
||
-- (ParseOk (HsModule _ _ _ _ ds)) -> return (map declName (filter isProp ds))
|
||
-- (ParseFailed loc s’) -> error (s’ ++ ” ” ++ show loc)
|
||
|
||
-- {- | checks if function binding name starts with @prop_@ indicating
|
||
-- that it is a quickcheck property -}
|
||
-- isProp :: HsDecl -> Bool
|
||
-- isProp d@(HsFunBind _) = “prop_” `isPrefixOf` (declName d)
|
||
-- isProp _ = False
|
||
|
||
-- {- | takes an HsDecl and returns the name of the declaration -}
|
||
-- declName :: HsDecl -> String
|
||
-- declName (HsFunBind (HsMatch _ (HsIdent name) _ _ _:_)) = name
|
||
-- declName _ = undefined
|
||
|
||
-- mkCheck name = [| putStr (name ++ ": ")
|
||
-- >> quickCheck $(varE (mkName name)) |]
|
||
|
||
-- mkChecks [] = undefined -- if we don't have any tests, then the test suite is undefined right?
|
||
-- mkChecks [name] = mkCheck name
|
||
-- mkChecks (name:ns) = [| $(mkCheck name) >> $(mkChecks ns) |]
|
||
|
||
-- {-# OPTIONS_GHC -fno-warn-unused-imports -no-recomp -fth #-}
|
||
-- runTests :: IO ()
|
||
-- runTests = $(mkChecks tests)
|
||
|
||
-- ghc --make Unit.hs -main-is Unit.runTests -o unit
|