I will update teh docs (as soon as I can get ledger to build again :(

On Mon, Feb 27, 2012 at 11:39, John Wiegley <[email protected]> wrote:

> A long asked-for feature, pre-declarations, has now arrived!
>
> This feature comes with some breaking changes, even damaging backwards
> compatibility with 2.x.  I believe it is worth it for the gain in
> consistency.
>
>
> ------------------------------------------------------------------------------
> # BREAKING CHANGES
>
> ## 'account' directive
>
> In 2.x, you could enclose a group of transactions within a parent account:
>
>  account My Master
>  ...
>  end account
>
> This is now done with "apply account" instead of "account":
>
>  apply account My Master
>  ...
>  end apply
>
> You can also use "end apply account", and Ledger will verify that it
> matches
> an enclosing "apply account".
>
> ## 'tag' directive
>
> In 3.x, you could apply a tag to a group of transactions:
>
>  tag Foo: Bar
>  ...
>  end tag
>
> This is now done with "apply tag" instead of "tag":
>
>  apply tag Foo: Bar
>  ...
>  end apply tag
>
>
> ------------------------------------------------------------------------------
> # NEW DIRECTIVES
>
> There are four all new directives:
>
>  account
>  payee
>  commodity
>  tag
>
> ## New 'account' directive
>
> You can now pre-declare account names.  This only has effect if --strict or
> --pedantic is used (see below).
>
>  account Expenses:Food
>  account Expenses:Gas
>
> ### Account sub-directives
>
> The 'account' directive supports several optional sub-directives, if they
> immediately follow the account directive and if they begin with whitespace:
>
>  account Expenses:Food
>      note This account is all about the chicken!
>      alias food
>      payee ^(KFC|Popeyes)$
>      check commodity == "$"
>      assert commodity == "$"
>      eval print("Hello!")
>      default
>
> The 'note' sub-directive associates a textual note with the account.  This
> can
> be accessed later using the 'note' valexpr function in any account context.
>
> The 'alias' sub-directive, which can occur multiple times, allows the
> alias to
> be used in place of the full account name anywhere that account names are
> allowed.
>
> The 'payee' sub-directive, which can occur multiple times, provides regexps
> that identify the account if that payee is encountered and an account
> within
> its transaction ends in the name "Unknown".  Example:
>
>  2012-02-27 KFC
>      Expenses:Unknown      $10.00  ; Read now as "Expenses:Food"
>      Assets:Cash
>
> The 'check' and 'assert' directives warn or error (respectively) if the
> given
> value expression evaluates to false within the context of any posting.
>
> The 'eval' directive evaluates the value expression in the context of the
> account at the time of definition.  At the moment this has little value.
>
> The 'default' directive specifies that this account should be used as the
> "balancing account" for any future transactions that contain only a single
> posting.
>
> ## New 'payee' directive
>
> You can now pre-declare payee names.  This only has effect if
> --check-payees
> is used in addition to --strict or --pedantic (see below).
>
>  payee KFC
>  payee Payless
>
> ### Payee sub-directives
>
> The 'payee' directive supports one optional sub-directive, if it
> immediately
> follows the payee directive and if it begins with whitespace:
>
>  payee KFC
>      alias KENTUCKY FRIED CHICKEN
>
> The 'alias' directive provides a regexp which, if it matches a parsed
> payee,
> the declared payee name is substituted:
>
>  2012-02-27 KENTUCKY FRIED CHICKEN  ; will be read as being 'KFC'
>    ...
>
> ## New 'commodity' directive
>
> You can now pre-declare commodity names.  This only has effect if --strict
> or
> --pedantic is used (see below).
>
>  commodity $
>  commodity CAD
>
> ### Commodity sub-directives
>
> The 'commodity' directive supports several optional sub-directives, if they
> immediately follow the commodity directive and if they begin with
> whitespace:
>
>  commodity $
>    note American Dollars
>    format $1,000.00
>    nomarket
>    default
>
> The 'note' sub-directive associates a textual note with the commodity.  At
> present this has no value other than documentation.
>
> The 'format' directive gives you a way to tell Ledger how to format this
> commodity.  In future using this directive will disable Ledger's
> observation
> of other ways that commodity is used, and will provide the "canonical"
> representation.
>
> The 'nomarket' directive states that the commodity's price should never be
> auto-downloaded.
>
> The 'default' directive marks this as the "default" commodity, in contexts
> where that applies (the same as the current 'D' directive).
>
> ## New 'tag' directive
>
> You can now pre-declare tag names.  This only has effect if --strict or
> --pedantic is used (see below).
>
>  tag Receipt
>  tag CSV
>
> ### Tag sub-directives
>
> The 'tag' directive supports two optional sub-directives, if they
> immediately
> follow the tag directive and if they begin with whitespace:
>
>  tag Receipt
>    check value =~ /pattern/
>    assert value != "foobar"
>
> The 'check' and 'assert' directives warn or error (respectively) if the
> given
> value expression evaluates to false within the context of any use of the
> related tag.  In such a context, "value" is bound to the value of the tag
> (which may not be a string if typed-metadata is used!).  Such checks or
> assertions are not called if no value is given.
>
>
> ------------------------------------------------------------------------------
> # "KNOWN" ENTITIES
>
> Normally, an account/payee/commodity/tag is considered "known" to Ledger if
> it:
>
>  1. Occurs within a predeclaration, using the directives above.
>  2. Occurs within a cleared or pending posting or transaction.
>
> Otherwise, if the account/payee/commodity/tag is first encountered in an
> uncleared posting or transaction, it is considered "unknown".
>
> By default, this distinction has no meaning whatsoever, and is not
> maintained
> for the sake of speed.  It only has meaning if --strict or --pedantic is
> used
> (see next section).
>
>
> ------------------------------------------------------------------------------
> # NEW OPTIONS
>
> ## --explicit
>
> When --explicit is given, *only* predeclarations establish the
> "known-ness" of
> parsed entities.  I.e., if you didn't predeclare it, you don't expect to
> ever
> see it.
>
> ## --strict
>
> With --strict, referring to unknown entities causes a warning.
>
> ## --pedantic
>
> With --pedantic, referring to unknown entities causes an error.
>
> ## --check-payees
>
> By default, even with --strict or --pedantic, payees are not checked for
> known-ness because it is quite typical that new payees are used in
> uncleared
> transactions, or without declaring them.  The --check-payees option enables
> --strict and --pedantic checking for payees as well.
>
>
> ------------------------------------------------------------------------------
> # EXAMPLE
>
> Here's a real example from the baseline tests.  Remember that options can
> be
> specified directly within your Ledger file!
>
>  --explicit
>  --pedantic
>
>  commodity $
>      format $1,000.00
>
>  account Assets:Cash
>      assert abs(amount) <= 20
>      check commodity == '$'
>
>  account Expenses:Food
>      alias food
>      payee KFC
>
>  2012-02-27 KFC
>      Expenses:Unknown                          $20.00
>      Assets:Cash
>
>  2012-02-28 KFC
>      food                                      $20.00
>      Assets:Cash
>
>  test reg --strict
>  12-Feb-27 KFC                   Expenses:Food                $20.00
> $20.00
>                                  Assets:Cash                 $-20.00
>      0
>  12-Feb-28 KFC                   Expenses:Food                $20.00
> $20.00
>                                  Assets:Cash                 $-20.00
>      0
>  end test
>



-- 
Craig, Corona De Tucson, AZ
enderw88.wordpress.com

Reply via email to