Thank you sir :)

Good to know! There's a few useful utility functions in that file, thank 
you.

In the end, the whole thing simplifies to this:

from beancount.loader import load_file
from beancount.core import data
import re

# MAIN
if __name__ == "__main__" :

    # parse beancount file
    entries, errors, options = load_file("somefile.beancount")
    # gather metadata from all account 'open' directives
    meta = { k: v for ent in entries for k, v in ent.meta.items()
        if type(ent) == data.Open and re.match('.*CLIENT', ent.account)
        }

    # print statement from earlier example goes here

... sorry for the kudgy code on the first go; I'm still thawing from having 
been deep in C+asm country for some time :P

best,

Sirio

On Wednesday, May 3, 2017 at 3:53:46 AM UTC+2, Martin Blais wrote:
>
> I love to see these custom solutions.
> Really glad the API's working for you.
>
> BTW, there's a function that will gather a mapping of the open/close 
> directories here:
>
> https://bitbucket.org/blais/beancount/src/377fdf5891e427f1f6041e7d257915a17e784745/beancount/core/getters.py?at=default&fileviewer=file-view-default#getters.py-264
> Might be useful (but it does look like you don't need it).
>
> Cheers,
>
>
>
> On Mon, May 1, 2017 at 11:08 AM, <[email protected] <javascript:>> wrote:
>
>> Thank you very much for your answers.
>> In the end I took your advice and defined metadata on the account's Open 
>> directive:
>>
>> 2017-03-01      open 
>> *Assets:Credits:CLIENT*   name: "Client's Company Name"
>>    address: "1234 somewhere, someplace 0000 USA"
>>    e-mail: "[email protected] <javascript:>"
>>
>> And accessed the metadata in Python directly:
>>
>> #!/usr/bin/env python3
>> from beancount.core import data
>> import re
>>
>> def get_open_meta(entries, acct_regex):
>>     """
>>     Return a dictionary formed from combining the metadata dictionaries
>>         of all 'Open' statements for accounts matching 'acct_regex'.
>>
>>     Will return an empty dicionary if no accounts matched.
>>
>>     Done this say so that metadata from multiple related accounts can be 
>> gathered
>>         into one set, which can then be queried.
>>     """
>>     meta = {}
>>     for ent in entries:
>>         if type(ent) == data.Open and re.match(acct_regex, ent.account):
>>             meta.update(ent.meta)
>>     return meta
>>
>>
>> # MAIN
>> if __name__ == "__main__" :
>>     from beancount import loader
>>     entries, errors, options = loader.load_file("somefile.beancount")
>>     meta = get_open_meta(entries, '.*CLIENT') #client metadata
>>
>>     print("""
>> {0}
>> {1}
>> {2}""".format(meta['name'], #will error if 'name' not defined
>>               ' \n'.join(meta['address'].split('; ')), #allows multiple 
>> lines as 'line1; line2'
>>               meta.get('e-mail')) #doesn't barf if e-mail isn't specified
>>     )
>>
>>
>>
>> On Wednesday, April 26, 2017 at 5:07:14 PM UTC+2, [email protected] 
>> wrote:
>>>
>>> Hello All,
>>>
>>> Is there a way to query directives which are not transactions?
>>> Currently I'm seeing this:
>>>
>>> beancount> select * where type != "transaction"
>>>
>>> (empty)
>>>
>>> beancount> 
>>>
>>>
>>>
>>> The problem I'm trying to solve is invoice generation: want to store 
>>> client-specific metadata (e.g.: address) in the ledger somewhere; then 
>>> query them and have the results be the various fields of the generated 
>>> invoice.
>>>
>>> An example might be:
>>>
>>> 2017-03-01      note    *Assets:Credits:CLIENT*      "Via Lungolago 13, 
>>> CH-6900 Lugano"      #address
>>>
>>> And an example query might be:
>>>
>>> SELECT last(narration) FROM (type = "note") AND ("address" in tags) 
>>> WHERE account = "*Assets:Credits:CLIENT*"
>>> ... assuming that a note's text field is referred to as "narration".
>>>
>>> This would have the advantage of being able to declare new addresses if 
>>> the client moves.
>>> The #address tag is so that other notes may exist without breaking this 
>>> query.
>>>
>>>
>>>
>>> I'm not sure if this is the way this problem should be solved, maybe a 
>>> different approach is best?
>>>
>>> Thank you very much,
>>>
>>> Sirio
>>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "Beancount" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/beancount/fd6fd747-fc78-48f1-a86e-5e282a8676d2%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/beancount/fd6fd747-fc78-48f1-a86e-5e282a8676d2%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Beancount" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beancount/2037fd82-3325-4e14-8d19-a0db42496c45%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to