Example #1
0
def do_missing_open(filename, args):
    """Print out Open directives that are missing for the given input file.

    This can be useful during demos in order to quickly generate all the
    required Open directives without having to type them manually.

    Args:
      filename: A string, which consists in the filename.
      args: A tuple of the rest of arguments. We're expecting the first argument
        to be an integer as a string.
    """
    from beancount.parser import printer
    from beancount.core import data
    from beancount.core import getters
    from beancount import loader

    entries, errors, options_map = loader.load_file(filename)

    # Get accounts usage and open directives.
    first_use_map, _ = getters.get_accounts_use_map(entries)
    open_close_map = getters.get_account_open_close(entries)

    new_entries = []
    for account, first_use_date in first_use_map.items():
        if account not in open_close_map:
            new_entries.append(
                data.Open(data.new_metadata(filename, 0), first_use_date,
                          account, None, None))

    dcontext = options_map['dcontext']
    printer.print_entries(data.sorted(new_entries), dcontext)
Example #2
0
def auto_insert_open(entries, unused_options_map):
    """Insert implicitly defined prices from Transactions.

    Explicit price entries are simply maintained in the output list. Prices from
    postings with costs or with prices from Transaction entries are synthesized
    as new Price entries in the list of entries output.

    Args:
      entries: A list of directives. We're interested only in the Transaction instances.
      unused_options_map: A parser options dict.
    Returns:
      A list of entries, possibly with more Price entries than before, and a
      list of errors.
    """
    opened_accounts = {
        entry.account
        for entry in entries if isinstance(entry, data.Open)
    }

    new_entries = []
    accounts_first, _ = getters.get_accounts_use_map(entries)
    for index, (account,
                date_first_used) in enumerate(sorted(accounts_first.items())):
        if account not in opened_accounts:
            meta = data.new_metadata('<auto_accounts>', index)
            new_entries.append(
                data.Open(meta, date_first_used, account, None, None))

    if new_entries:
        new_entries.extend(entries)
        new_entries.sort(key=data.entry_sortkey)
    else:
        new_entries = entries

    return new_entries, []
Example #3
0
 def test_get_accounts_use_map(self):
     entries = loader.load_string(TEST_INPUT)[0]
     accounts_first, accounts_last = getters.get_accounts_use_map(entries)
     self.assertEqual({'Expenses:Coffee': datetime.date(2012, 2, 1),
                       'Expenses:Restaurant': datetime.date(2012, 2, 1),
                       'Assets:US:Cash': datetime.date(2012, 2, 1),
                       'Expenses:Grocery': datetime.date(2012, 2, 1),
                       'Assets:US:Credit-Card': datetime.date(2012, 2, 1)},
                      accounts_first)
     self.assertEqual({'Expenses:Coffee': datetime.date(2013, 6, 22),
                       'Expenses:Restaurant': datetime.date(2013, 6, 20),
                       'Assets:US:Cash': datetime.date(2014, 2, 1),
                       'Expenses:Grocery': datetime.date(2012, 5, 18),
                       'Assets:US:Credit-Card': datetime.date(2014, 2, 1)},
                      accounts_last)
Example #4
0
def open_dit_accounts(entries, dit_component):
    """
    Minimally adapted from beancount.plugins.auto_accounts.
    """
    opened_accounts = {entry.account
                       for entry in entries
                       if isinstance(entry, data.Open)}

    new_entries = []
    accounts_first, _ = getters.get_accounts_use_map(entries)
    for index, (account, date_first_used) in enumerate(sorted(accounts_first.items())):
        if ((account not in opened_accounts) and
                has_component(account, dit_component)):
            meta = data.new_metadata(__name__, index)
            new_entry = data.Open(meta, date_first_used, account, None, None)
            new_entries.append(new_entry)

    return new_entries
Example #5
0
def open_dit_accounts(entries, dit_component):
    """
    Minimally adapted from beancount.plugins.auto_accounts.
    """
    opened_accounts = {
        entry.account
        for entry in entries if isinstance(entry, data.Open)
    }

    new_entries = []
    accounts_first, _ = getters.get_accounts_use_map(entries)
    for index, (account,
                date_first_used) in enumerate(sorted(accounts_first.items())):
        if ((account not in opened_accounts)
                and has_component(account, dit_component)):
            meta = data.new_metadata(__name__, index)
            new_entry = data.Open(meta, date_first_used, account, None, None)
            new_entries.append(new_entry)

    return new_entries
Example #6
0
def missing_open(filename):
    """Print Open directives missing in FILENAME.

    This can be useful during demos in order to quickly generate all the
    required Open directives without having to type them manually.

    """
    entries, errors, options_map = loader.load_file(filename)

    # Get accounts usage and open directives.
    first_use_map, _ = getters.get_accounts_use_map(entries)
    open_close_map = getters.get_account_open_close(entries)

    new_entries = []
    for account, first_use_date in first_use_map.items():
        if account not in open_close_map:
            new_entries.append(
                data.Open(data.new_metadata(filename, 0), first_use_date, account,
                          None, None))

    dcontext = options_map['dcontext']
    printer.print_entries(data.sorted(new_entries), dcontext)