penny 0.32.0.0 → 0.32.0.2
raw patch · 14 files changed
+790/−345 lines, 14 filesdep ~anonymous-sumsdep ~basedep ~bytestringsetup-changed
Dependency ranges changed: anonymous-sums, base, bytestring, matchers, multiarg, ofx, old-locale, penny, prednote, rainbow, random, random-shuffle, text, time
Files
- LICENSE +1/−1
- Makefile +12/−0
- README.md +163/−35
- Setup.hs +2/−0
- current-versions.txt +71/−0
- known-working-dependencies.txt +0/−67
- lib/Penny/Liberty.hs +5/−1
- lib/Penny/Lincoln/Bits/Qty.hs +12/−1
- minimum-versions.txt +66/−0
- penny.cabal +73/−230
- penny.cabal.m4 +337/−0
- tests/Lincoln.hs +10/−8
- tests/penny-gibberish.hs +2/−2
- versions.m4 +36/−0
LICENSE view
@@ -1,4 +1,4 @@-Copyright (c) 2011-2013 Omari Norman.+Copyright (c) 2011-2014 Omari Norman. All rights reserved. Redistribution and use in source and binary forms, with or without
+ Makefile view
@@ -0,0 +1,12 @@+all: penny.cabal++penny.cabal: penny.cabal.m4 versions.m4+ m4 versions.m4 penny.cabal.m4 > penny.cabal++clean:+ rm -f penny.cabal++minimum-versions.txt : penny.cabal sunlight-test.hs+ runghc sunlight-test.hs++.PHONY: clean
README.md view
@@ -1,52 +1,66 @@-Welcome to Penny, double-entry accounting.+# Penny - double-entry accounting -Penny's web pages are at:+Penny is a double-entry accounting system which is inspired by, but+incompatible with, Ledger, which is available at -http://massysett.github.com/penny+http://ledger-cli.org -http://hackage.haskell.org/package/penny+# Features -http://github.com/massysett/penny+Penny is: -Versions that contain at least one odd number are development-versions. They are not posted to Hackage. I try to keep the master-branch in compilable shape. However, development versions may not pass-all tests, and in particular they may have out of date or incomplete-documentation.+* double-entry accounting. It does not attempt to hide the+ machinery of double-entry accounting from you; for instance, it+ uses the terms "Debit" and "Credit". For a refresher on the basics+ of double-entry accounting, pick up a used accounting textbook from+ your favorite bookseller (they can be had cheaply, for less than ten+ U.S. dollars including shipping) or check out -Releases consist of code of reasonable quality. All of the groups in-their release numbers are even.+ http://www.principlesofaccounting.com/ -Penny is licensed under the MIT license, see the LICENSE file.+ which is a great free online text. -To install the latest release, "cabal install penny" should work. To-also build test executables, run "cabal install -ftest penny". That-will give you two additional executables: penny-test, which when run-will test a bunch of QuickCheck properties, and penny-gibberish, which-prints a random, but valid, ledger file.+* oriented around the command line and your text editor. -To install the manual pages and the documentation, run "sh-install-docs". It will install the manual pages to $PREFIX/share/man-and the other documentation to $PREFIX/share/doc/penny. By default-$PREFIX is /usr/local; you can change this by editing the-install-docs file and changing the "PREFIX" variable.+* extensible in Haskell; I have built many ancillary tools that I+ use "in-house" to do things like check the consistency of my+ records. Included are tools to automatically process and reconcile+ bank statements. -To remove the manual pages and the documentation, run "sh-install-docs remove."+* but fully-featured even if you know no Haskell, and you need not+ learn any Haskell to use Penny. -The first thing you will want to look at is the manual page-penny-basics(7). Then you will want to examine the starter.pny file-in the examples directory, which will show you how to write a ledger-file. penny-suite(7) will then direct you to other documentation that-may interest you.+* logical. Or at least I hope so. The command-line syntax attempts+ to be as regular as possible. -Though I do use this program to maintain all my financial records, it-is still relatively new and no one but me has tested it. Use at your-own risk.+* good with Unicode text. -Dependencies-------------+* colorful and can use 256-color terminals. Reports make great+ effort to use all of your screen space automatically to present+ the most readable reports possible. +* able to handle multiple commodities in a logical and consistent+ way--handy if you wish to track stock or real estate holdings or+ transactions in different currencies.++* obsessive. If there was a choice between an easy way and a+ correct way, I picked the correct way. For instance, all+ arithmetic is done using decimal numbers rather than binary+ floating-point types.++* freely licensed under the BSD license.++* intended for use only on UNIX-like operating systems. In+ particular, the libraries it uses to print things to your terminal+ are available primarily on UNIX. Maybe it works on Cygwin too; I+ have no idea as I use Penny only on UNIX-like systems.++* tested with QuickCheck.++# Installation++## Dependencies+ cabal install will take care of all Haskell dependencies for you; however, there are also at least two C libraries you will need to install as Penny depends on other Haskell libraries that use these C@@ -63,5 +77,119 @@ http://www.gnu.org/software/ncurses/ Perhaps other, non-GNU curses implementations will work as well; I do not know. On Debian GNU/Linux systems, install `libncurses5-dev`.++## Haskell compiler++You will need to get the Glasgow Haskell Compiler. Most Linux+distributors package it, or you might be able to get it from the+[GHC website](http://www.haskell.org/ghc). Penny has been tested+with GHC versions 7.4.1 and 7.6.3; any version between those two+versions should also work.++## Cabal tool++The [Cabal tool](http://www.haskell.org/cabal/download.html) will+help you get the Haskell dependencies you need.++An easy way to get both GHC and the Cabal tool is to get the +[Haskell Platform](http://www.haskell.org/platform/). Currently,+versions 2013.2.0.0 or version 2012.4.0.0 should both work.++## Penny itself++To install Penny, just do:++ cabal update+ cabal install --enable-tests penny++I encourage you to run the tests, so the above commands will do+that, but if you want to skip them, instead just do++ cabal install penny++## Documentation++To install the manual pages and the documentation, you need to find+the downloaded archive. Typically this is at+`$HOME/.cabal/packages/hackage.haskell.org/penny`. Unpack this+archive and look inside. Run++ sh install-docs++It will install the manual pages to `$PREFIX/share/man`+and the other documentation to `$PREFIX/share/doc/penny`. By default+`$PREFIX` is `/usr/local`; you can change this by editing the+install-docs file and changing the `PREFIX` variable.++To remove the manual pages and the documentation, run++ sh install-docs remove++The first thing you will want to look at is the manual page+penny-basics(7). Then you will want to examine the starter.pny file+in the examples directory, which will show you how to write a ledger+file. penny-suite(7) will then direct you to other documentation that+may interest you.+++# Penny on the Web++Find Penny on Hackage at++http://hackage.haskell.org/package/penny++and on Github at++http://www.github.com/massysett/penny++and web pages are here:++http://massysett.github.io/penny++(I am going to phase out the separate web pages in favor of files in+the main source code tree.)++# Development and bugs++If you find any bugs or if you wish to contribute, please use+[Github](http://www.github.com/massysett/penny) (preferred) or send+email to <omari@smileystation.com> (which works just as well as+Github, but if everything else is equal for you and you would flip a+coin to determine which contact method to use, then please use+Github.)++# Version numbers++Versions are numbered like this: A.B.C.D. All regular releases that+are ready for use have only even numbers for each of A, B, C, and D.+Development releases have an odd number in at least one of A, B, C,+or D.++`A` is currently `0` and probably won't change soon.++I change `B` whenever I make a breaking change in the library, which+is quite often; or++I change `C` when I add functions to the library; or++I change `D` when I fix bugs, add documentation, or make adjustments+to the specification of which packages Penny depends on.++# Dependency documentation and bugs++Since the Haskell libraries Penny depends upon can move along+quickly, and because Haskell packages can weave complex dependency+graphs, sometimes Penny might not build for you. There is no+silver bullet solution to this; if you have build problems, please+report them to me via email or Github. Also, note that there are+two files in the Penny package that can help you diagnose issues:++* The `minimum-versions.txt` file will show the oldest software+ dependencies that are known to work with Penny; and++* The `current-versions.txt` file will show more recent dependencies+ that are also known to work with Penny.++# Test status [](https://travis-ci.org/massysett/penny)
Setup.hs view
@@ -1,2 +1,4 @@ import Distribution.Simple++main :: IO () main = defaultMain
+ current-versions.txt view
@@ -0,0 +1,71 @@+This package was tested to work with these dependency+versions and compiler version.+These are the default versions fetched by cabal install.+Tested as of: 2014-02-26 16:29:35.630124 UTC+Path to compiler: ghc-7.6.3+Compiler description: 7.6.3++/opt/ghc-7.6.3/lib/ghc-7.6.3/package.conf.d:+ Cabal-1.16.0+ array-0.4.0.1+ base-4.6.0.1+ bin-package-db-0.0.0.0+ binary-0.5.1.1+ bytestring-0.10.0.2+ containers-0.5.0.0+ deepseq-1.3.0.1+ directory-1.2.0.1+ filepath-1.3.0.1+ (ghc-7.6.3)+ ghc-prim-0.3.0.0+ (haskell2010-1.1.1.0)+ (haskell98-2.0.0.2)+ hoopl-3.9.0.0+ hpc-0.6.0.0+ integer-gmp-0.5.0.0+ old-locale-1.0.0.5+ old-time-1.1.0.1+ pretty-1.1.1.0+ process-1.1.0.2+ rts-1.0+ template-haskell-2.8.0.0+ time-1.4.0.1+ unix-2.6.0.1++/home/massysett/penny/sunlight-6512/db:+ MonadRandom-0.1.13+ QuickCheck-2.6+ action-permutations-0.0.0.0+ anonymous-sums-0.4.0.0+ base-unicode-symbols-0.2.2.4+ cereal-0.4.0.1+ comonad-4.0+ contravariant-0.4.4+ distributive-0.4+ either-4.1.1+ hashable-1.2.1.0+ haskell-lexer-1.0+ matchers-0.14.0.2+ monad-control-0.3.2.3+ mtl-2.1.2+ multiarg-0.24.0.4+ nats-0.1.2+ ofx-0.4.0.2+ parsec-3.1.5+ penny-0.32.0.2+ prednote-0.18.0.4+ pretty-show-1.6.7+ rainbow-0.6.0.4+ random-1.0.1.1+ random-shuffle-0.0.4+ semigroupoids-4.0+ semigroups-0.12.2+ split-0.2.2+ tagged-0.7+ terminfo-0.4.0.0+ text-1.1.0.0+ transformers-0.3.0.0+ transformers-base-0.4.1+ transformers-compat-0.1.1.1+ unordered-containers-0.2.3.3+
− known-working-dependencies.txt
@@ -1,67 +0,0 @@-These packages were known to work with Penny 0.32.0.0. These are-all the packages you will need, including for building the tests.--/var/lib/ghc/package.conf.d:- Cabal-1.16.0- array-0.4.0.1- base-4.6.0.1- bin-package-db-0.0.0.0- binary-0.5.1.1- bytestring-0.10.0.2- containers-0.5.0.0- deepseq-1.3.0.1- directory-1.2.0.1- filepath-1.3.0.1- (ghc-7.6.3)- ghc-prim-0.3.0.0- (haskell2010-1.1.1.0)- (haskell98-2.0.0.2)- hoopl-3.9.0.0- hpc-0.6.0.0- integer-gmp-0.5.0.0- old-locale-1.0.0.5- old-time-1.1.0.1- pretty-1.1.1.0- process-1.1.0.2- rts-1.0- template-haskell-2.8.0.0- time-1.4.0.1- unix-2.6.0.1--/home/massysett/penny/.cabal-sandbox/x86_64-linux-ghc-7.6.3-packages.conf.d:- MonadRandom-0.1.13- QuickCheck-2.6- action-permutations-0.0.0.0- anonymous-sums-0.2.0.0- base-unicode-symbols-0.2.2.4- cereal-0.4.0.1- comonad-4.0- contravariant-0.4.4- distributive-0.4- either-4.1.1- hashable-1.2.1.0- haskell-lexer-1.0- matchers-0.14.0.0- monad-control-0.3.2.3- mtl-2.1.2- multiarg-0.24.0.0- nats-0.1.2- ofx-0.4.0.0- parsec-3.1.5- penny-0.32.0.0- prednote-0.18.0.0- pretty-show-1.6.7- rainbow-0.6.0.0- random-1.0.1.1- random-shuffle-0.0.4- semigroupoids-4.0- semigroups-0.12.2- split-0.2.2- tagged-0.7- terminfo-0.4.0.0- text-1.1.0.0- transformers-0.3.0.0- transformers-base-0.4.1- transformers-compat-0.1.1.1- unordered-containers-0.2.3.3-
lib/Penny/Liberty.hs view
@@ -63,7 +63,6 @@ import System.Console.MultiArg (InputError(..)) import qualified System.Console.MultiArg.Combinator as C import System.Console.MultiArg.Combinator (OptSpec)-import Text.Read (readMaybe) import Text.Parsec (parse) import qualified Penny.Copper.Parsec as Pc@@ -259,6 +258,11 @@ current dt = C.OptSpec ["current"] [] (C.NoArg f) where f = E.or [P.date LT (L.toUTC dt), P.date EQ (L.toUTC dt)]++readMaybe :: Read a => String -> Maybe a+readMaybe s = case reads s of+ (i, ""):[] -> return i+ _ -> Nothing -- | Parses exactly one integer; fails if it cannot read exactly one. parseInt :: String -> Either Error Int
lib/Penny/Lincoln/Bits/Qty.hs view
@@ -109,7 +109,7 @@ import Control.Applicative ((<|>)) import Data.Text (Text) import qualified Data.Text as X-import Data.Ord(Down(..), comparing)+import Data.Ord(comparing) import Data.List ( genericLength, genericReplicate, sortBy, group, sort, genericSplitAt ) import Data.List.Split (chunksOf)@@ -377,6 +377,17 @@ mode :: Ord a => [a] -> Maybe a mode = listToMaybe . modes++newtype Down a = Down a++instance Eq a => Eq (Down a) where+ (==) (Down x) (Down y) = x == y++instance Ord a => Ord (Down a) where+ compare (Down x) (Down y) = case compare x y of+ LT -> GT+ GT -> LT+ _ -> EQ modes :: Ord a => [a] -> [a] modes
+ minimum-versions.txt view
@@ -0,0 +1,66 @@+This package was tested to work with these dependency+versions and compiler version.+These are the minimum versions given in the .cabal file.+Tested as of: 2014-02-26 16:29:35.630124 UTC+Path to compiler: ghc-7.4.1+Compiler description: 7.4.1++/var/lib/ghc/package.conf.d:+ Cabal-1.14.0+ array-0.4.0.0+ base-4.5.0.0+ bin-package-db-0.0.0.0+ binary-0.5.1.0+ bytestring-0.9.2.1+ containers-0.4.2.1+ deepseq-1.3.0.0+ directory-1.1.0.2+ extensible-exceptions-0.1.1.4+ filepath-1.3.0.0+ (ghc-7.4.1)+ ghc-prim-0.2.0.0+ (haskell2010-1.1.0.1)+ (haskell98-2.0.0.1)+ hoopl-3.8.7.3+ hpc-0.5.1.1+ integer-gmp-0.4.0.0+ old-locale-1.0.0.4+ old-time-1.1.0.0+ pretty-1.1.1.0+ process-1.1.0.1+ rts-1.0+ template-haskell-2.7.0.0+ time-1.4+ unix-2.5.1.0++/home/massysett/penny/sunlight-6512/db:+ MonadRandom-0.1.13+ QuickCheck-2.5+ action-permutations-0.0.0.0+ anonymous-sums-0.4.0.0+ cereal-0.3.5.2+ comonad-3.1+ contravariant-0.4.4+ either-3.4.1+ haskell-lexer-1.0+ matchers-0.14.0.2+ mtl-2.1.2+ multiarg-0.24.0.4+ nats-0.1.2+ ofx-0.4.0.2+ parsec-3.1.3+ penny-0.32.0.2+ prednote-0.18.0.4+ pretty-show-1.5+ rainbow-0.6.0.4+ random-1.0.0.0+ random-shuffle-0.0.4+ semigroupoids-3.1+ semigroups-0.9.2+ split-0.2.2+ tagged-0.7+ terminfo-0.4.0.0+ text-0.11.2.0+ transformers-0.3.0.0+ transformers-compat-0.1.1.1+
penny.cabal view
@@ -1,5 +1,9 @@+-- The penny.cabal file is generated using m4, the penny.cabal.m4+-- file, and the versions.m4 file. The Makefile will generate+-- penny.cabal for you.+ Name: penny-Version: 0.32.0.0+Version: 0.32.0.2 Cabal-version: >=1.8 Build-Type: Simple License: BSD3@@ -14,157 +18,13 @@ synopsis: Extensible double-entry accounting system -description: Penny is a double-entry accounting system. It is inspired- by, but incompatible with, John Wiegley's Ledger, which is available- at <http://ledger-cli.org/>. Installing this package with cabal- install will install the executable program and the necessary- libraries.-- .-- * Penny is a double-entry accounting system. It uses traditional- accounting terminology, such as the terms \"Debit\" and- \"Credit\". If you need a refresher on the basics of double-entry- accounting, pick up a used accounting textbook from your favorite- bookseller (they can be had cheaply, for less than ten U.S. dollars- including shipping) or check out- <http://www.principlesofaccounting.com/>, a great free online text.-- .-- * Penny is based around "Penny.Lincoln", a core library to represent- transactions and postings and their components, such as their- amounts and whether they are debits and credits. You can use- Lincoln all by itself even if you don't use the other components- of Penny, which you may find handy if you are a Haskell- programmer. I wrote Penny because I wanted a precise library to- represent my accounting data so I could analyze it programatically- and verify its consistency.-- .-- * Penny's command line interface and its reports give you- great flexibility to filter and sort postings. Each posting- within a transaction may have its own flags assigned (e.g. to- indicate whether the posting is cleared) and each posting may have- infinite \"tags\" assigned to it, giving you another way to- categorize your postings. For instance, you might have vacation- related postings in several different accounts, but you can give- them all a \"vacation\" tag.-- .-- * You can easily build a program to process downloads of Open- Financial Exchange data from your financial institution. Your- program will merge new transactions into your ledger- automatically.-- .-- * Full Unicode support.-- .-- * Penny's reports have color baked in from the beginning. You do not- have to use color, which is handy if you are sending- output to a file or if, well, you just don't like color.-- .-- * Penny's reports automatically adjust themselves to the width of- your screen. You can easily specify how much or how little data to- see with command line options.-- .-- * Penny handles multiple commodities (for example, multiple- currencies, stocks and bonds, tracking other assets, etc.) in an- easy and transparent way that is consistent with double-entry- accounting principles. It embraces the philosophy outlined in this- tutorial on multiple commodity accounting:- <http://www.mscs.dal.ca/~selinger/accounting/tutorial.html>.-- .-- * Penny stores amounts using only integers. This ensures the- accuracy of your data, as using floating point values to represent- money is a bad idea. Here is one explanation:- <http://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency>. The- use of integer arithmetic also makes Penny simpler internally, as- there is no need for arbitrary rounding to compensate for the- bizarre and inaccurate results that sometimes arise from the use of- floating-point values to represent currencies.-- .-- * Freely licensed under the MIT license. If you take this code,- improve it, lock it up and make it proprietary, and sell it,- AWESOME! I haven't lost anything because I still have my code and,- what's more, then maybe I can buy your product and not have to- maintain this one any more!-- .-- * Tested using QuickCheck. The tests are available in the Git- repository that also contains the main library. Not everything- is tested, but the tests that exist so far have already rooted- out some strange corner-case bugs.-- .-- Non-features / disadvantages:-- .-- * Written in Haskell. Yes, I think Haskell is the best tool ever,- but its compiler is not as commonly installed as compilers for C- or C++, and non-Haskellers will probably find Penny to be more- difficult to install than Ledger, as the latter is written in C++.-- .-- * Handling commodities requires that you set up multiple accounts;- some might find this cumbersome.-- .-- * Young and not well tested yet.-- .-- * Runs only on Unix-like operating systems.-- .-- * Full Penny functionality is available without a Haskell compiler;- you could even use a pre-compiled binary. However, Penny does not- read configuration files at runtime; instead, to change the- default settings, you will need to have GHC installed so that you- can compile a custom binary.-+description:+ Penny is a double-entry accounting system. You keep your records in a+ plain-text file, and Penny gives you useful reports in your UNIX shell. .-- * Can be slow and memory hungry with large data sets. I have a- ledger file with about 28,000 lines. On my least capable machine- (which has an Intel Core 2 Duo at 1.6 GHz) this takes about 1.4- seconds to parse. Not horrible but not instantaneous- either. Generating a report about all these transactions can take- about seven seconds and a little less than 300 MB of memory. I- have eliminated all the obvious slowness from the code and- attempted a rewrite of the parser, which made no difference; other- ideas to speed up Penny with large data sets would involve- substantial changes and this is not at the top of my list because- the program is currently usable with relatively recent hardware.-+ For more information, please see .-- Unfortunately running \"cabal install\" will not- install the documentation, so you will need to find the downloaded- archive (usually in- \"$HOME/.cabal/packages/hackage.haskell.org/penny\") and unpack it- to see the documentation. You will want to start by reading the- README file, which will point you to additional documentation and- how to install it if you wish.+ <http://www.github.com/massysett/penny> extra-source-files: install-docs@@ -174,7 +34,11 @@ , doc/examples/*.pny , doc/man/*.1 , doc/man/*.7- , known-working-dependencies.txt+ , versions.m4+ , Makefile+ , current-versions.txt+ , minimum-versions.txt+ , penny.cabal.m4 source-repository head type: git@@ -182,58 +46,38 @@ Library - -- If updating any of these dependencies, remember to update- -- test dependencies too. Build-depends:- -- base - tracks Haskell Platform.- -- Haskell Platform 2013.2.0.0 is base 4.6.0.1- base ==4.6.*+ base >= 4.5.0.0 && < 5 - -- Haskell Platform packages- -- Currently, minimum versions reflect Haskell Platform 2013.2.0.0- -- Parsec - must use at least 3.1.2; it added an instance for- -- Text. Therefore '3.1.*' would not suffice.- --- -- If you are having problems getting Penny to build due to- -- dependencies and you can't fix it by using a cabal sandbox,- -- please let me know via email or Github.- --- -- Eventually I would like to test to make sure that the package- -- builds with the minimum possible version of each dependency;- -- developing a test for this would take a little while.- -- Meanwhile, I do include a list of known working dependencies- -- for this release in the file known-working-dependencies.txt.- -- -- Do not try to put comments on same line as data; Cabal does -- not allow this. -- Package Version- , bytestring >=0.10.0.2- , containers >=0.4.2.1- , old-locale >=1.0.0.5- , parsec >=3.1.3- , split >=0.2.2- , text >=0.11.3.1- , time >=1.4.0.1- , transformers >=0.3.0.0+ , bytestring >= 0.9.2.1+ , containers >= 0.4.2.1+ , old-locale >= 1.0.0.4+ , parsec >= 3.1.3+ , split >= 0.2.2+ , text >= 0.11.2.0+ , time >= 1.4+ , transformers >= 0.3.0.0 - -- Packages I maintain. Track the latest version.+ -- Omari packages -- Package Version- , anonymous-sums ==0.2.*- , matchers ==0.14.*- , multiarg ==0.24.*- , ofx ==0.4.*- , prednote ==0.18.*- , rainbow ==0.6.*+ , anonymous-sums >= 0.4.0.0+ , matchers >= 0.14.0.2+ , multiarg >= 0.24.0.4+ , ofx >= 0.4.0.2+ , prednote >= 0.18.0.4+ , rainbow >= 0.6.0.4 - -- Other packages. Try to keep dependencies as loose as- -- possible. Newer uploads might cause breakage, unfortunately.+ -- Other packages -- Package Version- , action-permutations ==0.0.0.0- , cereal >=0.3.5.2- , either >=3.4.1- , pretty-show >=1.5- , semigroups >=0.9.2+ , action-permutations == 0.0.0.0+ , cereal >= 0.3.5.2+ , either >= 3.4.1+ , pretty-show >= 1.5+ , semigroups >= 0.9.2 Exposed-modules: Penny@@ -335,36 +179,25 @@ , Lincoln hs-source-dirs: tests - -- Be sure the build-depends are listed within the if block;- -- otherwise, cabal install will always include these- -- build-dependencies in any build, even non-test builds. However,- -- you still have to list all the build-depends--the library- -- build-depends are included for dependency resolving purposes but- -- not for building purposes.-- -- Test dependencies. test-framework has issues with newer versions,- -- see- -- https://github.com/batterseapower/test-framework/issues/34- -- For details on why penny is a dependency here, see -- http://stackoverflow.com/questions/6711151 build-depends:- penny- , base ==4.6.*+ penny == 0.32.0.2+ , base >= 4.5.0.0 && < 5 -- Packages I maintain- , multiarg ==0.24.*- , anonymous-sums ==0.2.*+ , multiarg >= 0.24.0.4+ , anonymous-sums >= 0.4.0.0 -- Other packages- , QuickCheck >=2.5- , random-shuffle ==0.0.4- , parsec >= 3.1.3- , semigroups >=0.9.2- , text >=0.11.3.1- , time >=1.4.0.1- , transformers >=0.3.0.0+ , QuickCheck >= 2.5+ , random-shuffle >= 0.0.4+ , parsec >= 3.1.3+ , semigroups >= 0.9.2+ , text >= 0.11.2.0+ , time >= 1.4+ , transformers >= 0.3.0.0 ghc-options: -Wall @@ -377,20 +210,20 @@ if flag(build-gibberish) build-depends:- penny- , base ==4.6.*+ penny == 0.32.0.2+ , base >= 4.5.0.0 && < 5 -- Packages I maintain- , multiarg ==0.24.*+ , multiarg >= 0.24.0.4 -- Other packages- , QuickCheck >=2.5- , random-shuffle ==0.0.4- , random >=1.0.1.1- , semigroups >=0.9.2- , text >=0.11.3.1- , time >=1.4.0.1- , transformers >= 0.3.0.0+ , QuickCheck >= 2.5+ , random-shuffle >= 0.0.4+ , random >= 1.0.0.0+ , semigroups >= 0.9.2+ , text >= 0.11.2.0+ , time >= 1.4+ , transformers >= 0.3.0.0 else buildable: False@@ -402,7 +235,9 @@ Default: False Executable penny- Build-depends: penny, base+ Build-depends:+ penny ==0.32.0.2+ , base >= 4.5.0.0 && < 5 hs-source-dirs: bin Main-is: penny-main.hs@@ -419,7 +254,9 @@ Default: True Executable penny-selloff- Build-depends: penny, base+ Build-depends:+ penny == 0.32.0.2+ , base >= 4.5.0.0 && < 5 other-modules: Paths_penny hs-source-dirs: bin@@ -436,7 +273,9 @@ Default: True Executable penny-diff- Build-depends: penny, base+ Build-depends:+ penny == 0.32.0.2+ , base >= 4.5.0.0 && < 5 hs-source-dirs: bin Main-is: penny-diff.hs@@ -453,7 +292,9 @@ Default: True Executable penny-reprint- Build-depends: penny, base+ Build-depends:+ penny == 0.32.0.2+ , base >= 4.5.0.0 && < 5 hs-source-dirs: bin main-is: penny-reprint.hs@@ -467,7 +308,9 @@ Default: True Executable penny-reconcile- Build-depends: penny, base+ Build-depends:+ penny == 0.32.0.2+ , base >= 4.5.0.0 && < 5 hs-source-dirs: bin main-is: penny-reconcile.hs
+ penny.cabal.m4 view
@@ -0,0 +1,337 @@+-- The penny.cabal file is generated using m4, the penny.cabal.m4+-- file, and the versions.m4 file. The Makefile will generate+-- penny.cabal for you.++Name: penny+Version: pv_penny+Cabal-version: >=1.8+Build-Type: Simple+License: BSD3+Copyright: 2012-2014 Omari Norman.+author: Omari Norman+maintainer: omari@smileystation.com+stability: Experimental+homepage: http://www.github.com/massysett/penny+bug-reports: omari@smileystation.com+Category: Console, Finance+License-File: LICENSE++synopsis: Extensible double-entry accounting system++description:+ Penny is a double-entry accounting system. You keep your records in a+ plain-text file, and Penny gives you useful reports in your UNIX shell.+ .+ For more information, please see+ .+ <http://www.github.com/massysett/penny>++extra-source-files:+ install-docs+ , README.md+ , doc/*.dot+ , doc/*.hs+ , doc/examples/*.pny+ , doc/man/*.1+ , doc/man/*.7+ , versions.m4+ , Makefile+ , current-versions.txt+ , minimum-versions.txt+ , penny.cabal.m4++source-repository head+ type: git+ location: git://github.com/massysett/penny.git++Library++ Build-depends:+ base >= pv_base && < pv_base_max++ -- Do not try to put comments on same line as data; Cabal does+ -- not allow this.++ -- Package Version+ , bytestring >= pv_bytestring+ , containers >= pv_containers+ , old-locale >= pv_old_locale+ , parsec >= pv_parsec+ , split >= pv_split+ , text >= pv_text+ , time >= pv_time+ , transformers >= pv_transformers++ -- Omari packages+ -- Package Version+ , anonymous-sums >= pv_anonymous_sums+ , matchers >= pv_matchers+ , multiarg >= pv_multiarg+ , ofx >= pv_ofx+ , prednote >= pv_prednote+ , rainbow >= pv_rainbow++ -- Other packages+ -- Package Version+ , action-permutations == pv_action_permutations+ , cereal >= pv_cereal+ , either >= pv_either+ , pretty-show >= pv_pretty_show+ , semigroups >= pv_semigroups++ Exposed-modules:+ Penny+ , Penny.Brenner+ , Penny.Brenner.Clear+ , Penny.Brenner.Database+ , Penny.Brenner.Import+ , Penny.Brenner.Info+ , Penny.Brenner.Merge+ , Penny.Brenner.OFX+ , Penny.Brenner.Print+ , Penny.Brenner.Types+ , Penny.Brenner.Util+ , Penny.Cabin+ , Penny.Cabin.Balance+ , Penny.Cabin.Balance.Convert+ , Penny.Cabin.Balance.Convert.Chunker+ , Penny.Cabin.Balance.Convert.ChunkerPct+ , Penny.Cabin.Balance.Convert.Options+ , Penny.Cabin.Balance.Convert.Parser+ , Penny.Cabin.Balance.MultiCommodity+ , Penny.Cabin.Balance.MultiCommodity.Chunker+ , Penny.Cabin.Balance.MultiCommodity.Parser+ , Penny.Cabin.Balance.Util+ , Penny.Cabin.Interface+ , Penny.Cabin.Meta+ , Penny.Cabin.Options+ , Penny.Cabin.Parsers+ , Penny.Cabin.Posts+ , Penny.Cabin.Posts.Allocated+ , Penny.Cabin.Posts.BottomRows+ , Penny.Cabin.Posts.Fields+ , Penny.Cabin.Posts.Growers+ , Penny.Cabin.Posts.Chunk+ , Penny.Cabin.Posts.Meta+ , Penny.Cabin.Posts.Parser+ , Penny.Cabin.Posts.Spacers+ , Penny.Cabin.Posts.Types+ , Penny.Cabin.Row+ , Penny.Cabin.Scheme+ , Penny.Cabin.Scheme.Schemes+ , Penny.Cabin.TextFormat+ , Penny.Copper+ , Penny.Copper.Interface+ , Penny.Copper.Parsec+ , Penny.Copper.Render+ , Penny.Copper.Terminals+ , Penny.Denver+ , Penny.Denver.Diff+ , Penny.Denver.Reprint+ , Penny.Denver.Selloff+ , Penny.Denver.Reconcile+ , Penny.Liberty+ , Penny.Lincoln+ , Penny.Lincoln.Balance+ , Penny.Lincoln.Bits+ , Penny.Lincoln.Bits.DateTime+ , Penny.Lincoln.Bits.Open+ , Penny.Lincoln.Bits.Price+ , Penny.Lincoln.Bits.Qty+ , Penny.Lincoln.Builders+ , Penny.Lincoln.Ents+ , Penny.Lincoln.Equivalent+ , Penny.Lincoln.HasText+ , Penny.Lincoln.Matchers+ , Penny.Lincoln.Natural+ , Penny.Lincoln.Predicates+ , Penny.Lincoln.Predicates.Siblings+ , Penny.Lincoln.PriceDb+ , Penny.Lincoln.Queries+ , Penny.Lincoln.Queries.Siblings+ , Penny.Lincoln.Serial+ , Penny.Shield+ , Penny.Steel+ , Penny.Wheat+ , Penny.Zinc++ Other-modules:+ Paths_penny++ hs-source-dirs: lib++ if flag(incabal)+ cpp-options: -Dincabal++ ghc-options: -Wall+ if flag(debug)+ ghc-options: -auto-all -caf-all++Test-Suite penny-test+ type: exitcode-stdio-1.0+ Main-is: penny-test.hs+ other-modules:+ Copper+ , Copper.Gen.Parsers+ , Copper.Gen.Terminals+ , Copper.Parser+ , Copper.Render+ , Lincoln+ hs-source-dirs: tests++ -- For details on why penny is a dependency here, see+ -- http://stackoverflow.com/questions/6711151++ build-depends:+ penny == pv_penny+ , base >= pv_base && < pv_base_max++ -- Packages I maintain+ , multiarg >= pv_multiarg+ , anonymous-sums >= pv_anonymous_sums++ -- Other packages+ , QuickCheck >= pv_QuickCheck+ , random-shuffle >= pv_random_shuffle+ , parsec >= pv_parsec+ , semigroups >= pv_semigroups+ , text >= pv_text+ , time >= pv_time+ , transformers >= pv_transformers++ ghc-options: -Wall++Executable penny-gibberish+ Main-is: penny-gibberish.hs+ other-modules:+ Copper.Gen.Parsers+ , Copper.Gen.Terminals+ hs-source-dirs: tests++ if flag(build-gibberish)+ build-depends:+ penny == pv_penny+ , base >= pv_base && < pv_base_max++ -- Packages I maintain+ , multiarg >= pv_multiarg++ -- Other packages+ , QuickCheck >= pv_QuickCheck+ , random-shuffle >= pv_random_shuffle+ , random >= pv_random+ , semigroups >= pv_semigroups+ , text >= pv_text+ , time >= pv_time+ , transformers >= pv_transformers++ else+ buildable: False++ ghc-options: -Wall++Flag build-gibberish+ Description: Build the penny-gibberish executable+ Default: False++Executable penny+ Build-depends:+ penny ==pv_penny+ , base >= pv_base && < pv_base_max++ hs-source-dirs: bin+ Main-is: penny-main.hs+ Other-modules: Paths_penny+ GHC-Options: -Wall+ if flag(debug)+ GHC-Options: -rtsopts -auto-all -caf-all++ if ! flag(build-penny)+ buildable: False++Flag build-penny+ Description: Build the penny executable+ Default: True++Executable penny-selloff+ Build-depends:+ penny == pv_penny+ , base >= pv_base && < pv_base_max++ other-modules: Paths_penny+ hs-source-dirs: bin+ Main-is: penny-selloff.hs+ GHC-Options: -Wall+ if flag(debug)+ GHC-Options: -rtsopts -auto-all -caf-all++ if ! flag(build-selloff)+ buildable: False++Flag build-selloff+ Description: Build the penny-selloff executable+ Default: True++Executable penny-diff+ Build-depends:+ penny == pv_penny+ , base >= pv_base && < pv_base_max++ hs-source-dirs: bin+ Main-is: penny-diff.hs+ Other-modules: Paths_penny+ GHC-Options: -Wall+ if flag(debug)+ GHC-Options: -rtsopts -auto-all -caf-all++ if ! flag(build-diff)+ buildable: False++Flag build-diff+ Description: Build the penny-diff executable+ Default: True++Executable penny-reprint+ Build-depends:+ penny == pv_penny+ , base >= pv_base && < pv_base_max++ hs-source-dirs: bin+ main-is: penny-reprint.hs+ Other-modules: Paths_penny+ ghc-options: -Wall+ if ! flag(build-reprint)+ buildable: False++Flag build-reprint+ Description: Build the penny-reprint executable+ Default: True++Executable penny-reconcile+ Build-depends:+ penny == pv_penny+ , base >= pv_base && < pv_base_max++ hs-source-dirs: bin+ main-is: penny-reconcile.hs+ Other-modules: Paths_penny+ ghc-options: -Wall+ if ! flag(build-reconcile)+ buildable: False++Flag build-reconcile+ Description: Build the penny-reconcile executable+ Default: True++Flag debug+ Description: turns on some debugging options+ Default: False++Flag test+ Description: enables QuickCheck tests+ Default: False++Flag incabal+ Description: enables imports that only Cabal makes available+ Default: True+
tests/Lincoln.hs view
@@ -835,14 +835,16 @@ deriving (Eq, Show) instance Arbitrary InferableMutatedQty where- arbitrary = do- BalEntries ls <- arbitrary- let en = head ls- am = L.amount en- cy = L.commodity am- q <- genMutate . L.qty $ am- let en' = L.Entry (L.drCr en) (L.Amount q cy)- fmap InferableMutatedQty . shuffle $ en' : tail ls+ arbitrary = go `QG.suchThat` prop_inferableMutatedQty+ where+ go = do+ BalEntries ls <- arbitrary+ let en = head ls+ am = L.amount en+ cy = L.commodity am+ q <- genMutate . L.qty $ am+ let en' = L.Entry (L.drCr en) (L.Amount q cy)+ fmap InferableMutatedQty . shuffle $ en' : tail ls -- | InferableMutatedQty behaves as it should prop_inferableMutatedQty :: InferableMutatedQty -> Bool
tests/penny-gibberish.hs view
@@ -34,13 +34,13 @@ options :: [MA.OptSpec (Opts -> Opts)] options =- [ MA.OptSpec ["size"] "s" . MA.OneArgE $ \s -> do+ [ MA.OptSpec ["size"] "s" . MA.OneArg $ \s -> do i <- MA.reader s if i < 1 then Left (MA.ErrorMsg "non-positive size parameter") else return (\os -> os { optSize = i }) - , MA.OptSpec ["count"] "c" . MA.OneArgE $ \s -> do+ , MA.OptSpec ["count"] "c" . MA.OneArg $ \s -> do i <- MA.reader s if i < 1 then Left (MA.ErrorMsg "non-positive count parameter")
+ versions.m4 view
@@ -0,0 +1,36 @@+divert(-1)++# Penny version+define(`pv_penny', `0.32.0.2')++# Haskell Platform+define(`pv_base', `4.5.0.0')+define(`pv_base_max', `5')+define(`pv_bytestring', `0.9.2.1')+define(`pv_containers', `0.4.2.1')+define(`pv_old_locale', `1.0.0.4')+define(`pv_parsec', `3.1.3')+define(`pv_QuickCheck', `2.5')+define(`pv_split', `0.2.2')+define(`pv_text', `0.11.2.0')+define(`pv_time', `1.4')+define(`pv_transformers', `0.3.0.0')++# Packages I maintain+define(`pv_anonymous_sums', `0.4.0.0')+define(`pv_matchers', `0.14.0.2')+define(`pv_multiarg', `0.24.0.4')+define(`pv_ofx', `0.4.0.2')+define(`pv_prednote', `0.18.0.4')+define(`pv_rainbow', `0.6.0.4')++# Other packages+define(`pv_action_permutations', `0.0.0.0')+define(`pv_cereal', `0.3.5.2')+define(`pv_either', `3.4.1')+define(`pv_pretty_show', `1.5')+define(`pv_random', `1.0.0.0')+define(`pv_random_shuffle', `0.0.4')+define(`pv_semigroups', `0.9.2')++divert(1)dnl