hledger/NOTES
2008-10-12 09:20:43 +00:00

150 lines
5.7 KiB
Plaintext

hledger project notes
"...simplicity of design was the most essential, guiding principle.
Clarity of concepts, economy of features, efficiency and reliability of
implementations were its consequences." --Niklaus Wirth
* to do
** bugs
** release 0.1
*** handle right-hand currency symbols
*** ledger 2.6-style account name eliding
*** cabal upload
*** #ledger test
*** haskell-cafe/ledger-cli announce
** ledger features
*** darcs-style --version
*** -C
*** negative account/description patterns
*** per-currency precision/thousands separator/symbol layout
*** mixed-currency amounts
*** ledger 2.6-style date matching
*** more speed
*** more ledger features
** new features
*** show in/out times in timelog entry descriptions
*** graphs
*** smart data entry
*** easier ui
** testing
*** run individual tests
*** reliable maintainable tests
*** easy ledger compatibility tests
*** speed tests
** documentation
*** implementation docs
*** api docs
*** user manual
*** differences/issues
**** ledger does not support -f- (without space)
**** ledger shows description comments as part of description, we do the same
**** ledger does not sort register by date
**** ledger can show wrong output due to thousands separators
**** ledger balance with an account pattern shows a redundant total
**** hledger does not detect symbol layout/thousands separators/precision based on first entry of each currency
**** hledger does not track currency/precision in as much detail
**** hledger ignores automated/periodic entries
**** hledger does not elide .00
* misc
** 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 ?
*** charts
[1:27pm] <sm> I have decided I am not getting enough visible day-to-day value out of my ledger, I need more of that to stay motivated
[1:27pm] <Nafai> What do you think will help in that?
[1:27pm] <sm> I think some simple self-updating charts, or even good reports in a visible place
[1:28pm] <sm> something I don't have to spend an hour fiddling with to get answers
[1:38pm] <sm> Nafai: identifying/designing some useful reports/charts seems to be blocking me
[1:39pm] <sm> there are probably some standard ones I should use
[1:40pm] <sm> a graph of daily net worth is probably one of the simplest
[1:58pm] <sm> what else.. a chart of weekly expenses in key categories
[1:58pm] <sm> ditto, monthly
[1:58pm] <sm> a chart of monthly income
[1:59pm] <sm> those three should help me be more clear about cashflow status
[2:00pm] <sm> also I'd like something that shows me how much I am on top of financial tracking - how current my numbers are, when last reconciled etc - at a glance
[2:01pm] <sm> another simple one: current balances in all accounts
[2:01pm] <sm> those would be a great start
[2:04pm] <sm> daily net worth, weekly expense, monthly expense, monthly income, confidence/currentness report, and balance report
[2:05pm] <sm> let's see, which of those 6 would give most payoff right now
[2:05pm] <sm> probably 5
[2:06pm] <sm> how could I measure that ?
[2:06pm] <sm> number of days since last ledger entry..
[2:06pm] <sm> number of ledger entries in last 30 days (compared to average)
[2:07pm] <sm> number of days since last cleared checking entry (indicating an online reconcile)
[2:08pm] <sm> those would be a good start. How do I make those visual
[2:09pm] <sm> well I guess the first step is a script to print them
** compare other languages! a parser generator and decent speed is required
*** python: http://cheeseshop.python.org/pypi/ZestyParser, pysec, pyparsing
*** squeak: LanguageGame, T-Gen, SmaCC
*** lisp: ?
*** ruby: too slow (?)
** data representation
*** http://www.python.org/dev/peps/pep-0327/
*** http://www.n-heptane.com/nhlab/repos/Decimal/
*** http://www.n-heptane.com/nhlab/repos/Decimal/Money.hs
*** http://www2.hursley.ibm.com/decimal/
** lispy's template haskell for quickcheck
-- find tests with template haskell
import Language.Haskell.Parser
{-# OPTIONS_GHC -fno-warn-unused-imports -no-recomp -fth #-}
{- ghc --make Unit.hs -main-is Unit.runTests -o unit -}
runTests :: IO ()
runTests = $(mkChecks props)
mkChecks [] = undefined
mkChecks [name] = mkCheck name
mkChecks (name:ns) = [| $(mkCheck name) >> $(mkChecks ns) |]
mkCheck name = [| putStr (name ++ ": ") >> quickCheck $(varE (mkName name)) |]
{- | looks in Tests.hs for functions like prop_foo and returns
the list. Requires that Tests.hs be valid Haskell98. -}
props :: [String]
props = unsafePerformIO $
do h <- openFile "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
** old import hierarchy
"Parse"
"TimeLog"
"Ledger"
"Account"
"Transaction"
"RawLedger"
"LedgerEntry"
"RawTransaction"
"AccountName"
"Amount"
"Currency"
"Types"
"Utils"