def do_linked(filename, args): """Print out a list of transactions linked to the one at the given line. 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 options from beancount.parser import printer from beancount.core import account_types from beancount.core import inventory from beancount.core import data from beancount.core import realization from beancount import loader # Parse the arguments, get the line number. if len(args) != 1: raise SystemExit("Missing line number argument.") lineno = int(args[0]) # Load the input file. entries, errors, options_map = loader.load_file(filename) # Find the closest entry. closest_entry = data.find_closest(entries, options_map['filename'], lineno) # Find its links. links = closest_entry.links if closest_entry is None: raise SystemExit("No entry could be found before {}:{}".format( filename, lineno)) if not links: return # Find all linked entries. linked_entries = [ entry for entry in entries if (isinstance(entry, data.Transaction) and entry.links and entry.links & links) ] # Render linked entries (in date order) as errors (for Emacs). errors = [RenderError(entry.meta, '', entry) for entry in linked_entries] printer.print_errors(errors) # Print out balances. real_root = realization.realize(linked_entries) realization.dump_balances(real_root, file=sys.stdout) # Print out net income change. acctypes = options.get_account_types(options_map) net_income = inventory.Inventory() for real_node in realization.iter_children(real_root): if account_types.is_income_statement_account(real_node.account, acctypes): net_income.add_inventory(real_node.balance) print() print('Net Income: {}'.format(-net_income))
def render_real_text(self, real_root, options_map, file): if self.args.filter_expression: regexp = re.compile(self.args.filter_expression) real_root = realization.filter( real_root, lambda real_account: regexp.search(real_account.account)) if real_root: realization.dump_balances(real_root, self.args.at_cost, True, file=file)
def render_real_text(self, real_root, options_map, file): if self.args.filter_expression: regexp = re.compile(self.args.filter_expression) real_root = realization.filter( real_root, lambda real_account: regexp.search(real_account.account)) if real_root: dformat = options_map['dcontext'].build(alignment=display_context.Align.DOT, reserved=2) realization.dump_balances(real_root, dformat, self.args.at_cost, True, file=file)
def test_dump_balances(self, entries, _, __): """ 2012-01-01 open Expenses:Restaurant 2012-01-01 open Liabilities:US:CreditCard 2012-01-01 open Liabilities:CA:CreditCard 2014-05-30 * Liabilities:CA:CreditCard 123.45 CAD Expenses:Restaurant 2014-05-31 * Liabilities:US:CreditCard 123.45 USD Expenses:Restaurant """ real_account = realization.realize(entries) self.assertLines(""" |-- Expenses | `-- Restaurant -123.45 CAD | -123.45 USD `-- Liabilities |-- CA | `-- CreditCard 123.45 CAD `-- US `-- CreditCard 123.45 USD """, realization.dump_balances(real_account))
def do_linked(filename, args): """Print out a list of transactions linked to the one at the given line. 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 a string which contains either a lineno integer or a filename:lineno combination (which can be used if the location is not in the top-level file). """ from beancount.parser import options from beancount.parser import printer from beancount.core import account_types from beancount.core import inventory from beancount.core import data from beancount.core import realization from beancount import loader # Parse the arguments, get the line number. if len(args) != 1: raise SystemExit("Missing line number or link argument.") location_spec = args[0] # Load the input file. entries, errors, options_map = loader.load_file(filename) # Accept an explicit link name as the location. Must include the '^' # character. if re.match(r"\^(.*)$", location_spec): search_filename = options_map['filename'] links = {location_spec[1:]} linked_entries = find_linked_entries(entries, links, False) else: # Parse the argument as a line number or a "<filename>:<lineno>" spec to # pull context from. match = re.match(r"(.+):(\d+)$", location_spec) if match: search_filename = path.abspath(match.group(1)) lineno = int(match.group(2)) elif re.match(r"(\d+)$", location_spec): # Parse the argument as just a line number to pull context from on # the main filename. search_filename = options_map['filename'] lineno = int(location_spec) else: raise SystemExit( "Invalid line number or link format for location.") # Find the closest entry. closest_entry = data.find_closest(entries, search_filename, lineno) # Find its links. if closest_entry is None: raise SystemExit("No entry could be found before {}:{}".format( search_filename, lineno)) links = (closest_entry.links if isinstance( closest_entry, data.Transaction) else data.EMPTY_SET) # Get the linked entries, or just the closest one, if no links. linked_entries = (find_linked_entries(entries, links, True) if links else [closest_entry]) # Render linked entries (in date order) as errors (for Emacs). errors = [RenderError(entry.meta, '', entry) for entry in linked_entries] printer.print_errors(errors) # Print out balances. real_root = realization.realize(linked_entries) dformat = options_map['dcontext'].build( alignment=display_context.Align.DOT, reserved=2) realization.dump_balances(real_root, dformat, file=sys.stdout) # Print out net income change. acctypes = options.get_account_types(options_map) net_income = inventory.Inventory() for real_node in realization.iter_children(real_root): if account_types.is_income_statement_account(real_node.account, acctypes): net_income.add_inventory(real_node.balance) print() print('Net Income: {}'.format(-net_income))
def print_balances_tree(realacc, accapi): print() print('Account balances:') dformat = accapi.options_map['dcontext'].build( alignment=display_context.Align.DOT, reserved=2) realization.dump_balances(realacc, dformat, file=sys.stdout)
def render_real_text(self, real_account, options_map, file): realization.dump_balances(real_account, file=file)