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 ** errors *** display mixed amounts vertically, not horizontally ** features *** flexible date expressions, for easier time reports *** commodity @ rate, for tracking client hours in main ledger *** actual/effective entry & txn dates, for ... *** --display, for reconciling recent transactions with real balance *** more ledger features from README *** new features **** option for strict ledger-compatible output (or, compare xml ?) **** --compare to compare ledger with same args **** workable horizontal commodities display **** in/out times in timelog entry descriptions **** graphs **** easier data entry **** flexible option ordering **** parse more file formats **** easy conversion from cabal-installed to darcs repo **** i18n *** speed **** profile **** cache file ** cleanups ** tests *** test on more ledger files *** speed regression tests *** more modular/scalable approach to test data ? *** figure out reliable maintainable appropriate tests *** easy ledger compatibility testing ** docs *** readme *** related blurbs - automate **** --version **** --help **** hledger.hs module description **** cabal file description **** darcsweb description **** home page description **** mail list description **** gmane description **** announcements description *** announcements **** archive *** release notes **** keep it simple *** implementation docs *** api docs *** developer intro *** user manual ** web presence *** clarify bugtracking process * misc ** differences noted *** ledger needs a space after -f *** ledger shows description comments as part of description *** ledger shows small time amounts in minutes *** ledger can get timelog entry balance wrong, see mail list ** 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] 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] What do you think will help in that? [1:27pm] I think some simple self-updating charts, or even good reports in a visible place [1:28pm] something I don't have to spend an hour fiddling with to get answers [1:38pm] Nafai: identifying/designing some useful reports/charts seems to be blocking me [1:39pm] there are probably some standard ones I should use [1:40pm] a graph of daily net worth is probably one of the simplest [1:58pm] what else.. a chart of weekly expenses in key categories [1:58pm] ditto, monthly [1:58pm] a chart of monthly income [1:59pm] those three should help me be more clear about cashflow status [2:00pm] 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] another simple one: current balances in all accounts [2:01pm] those would be a great start [2:04pm] daily net worth, weekly expense, monthly expense, monthly income, confidence/currentness report, and balance report [2:05pm] let's see, which of those 6 would give most payoff right now [2:05pm] probably 5 [2:06pm] how could I measure that ? [2:06pm] number of days since last ledger entry.. [2:06pm] number of ledger entries in last 30 days (compared to average) [2:07pm] number of days since last cleared checking entry (indicating an online reconcile) [2:08pm] those would be a good start. How do I make those visual [2:09pm] 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 ** separate commodity display settings type CommoditySymbol = String data CommodityDisplayPrefs = CommodityDisplayPrefs { side :: Side, -- ^ should the symbol appear on the left or the right spaced :: Bool, -- ^ should there be a space between symbol and quantity comma :: Bool, -- ^ should thousands be comma-separated precision :: Int, -- ^ number of decimal places to display } deriving (Eq,Show) data Amount = Amount { commodity :: CommoditySymbol, quantity :: Double } deriving (Eq)