Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
return inv.reduce(convert.convert_position, currency, context.price_map, date)
class ValueInventory(query_compile.EvalFunction):
"Coerce an inventory to its market value at the current date."
__intypes__ = [inventory.Inventory]
def __init__(self, operands):
super().__init__(operands, inventory.Inventory)
def __call__(self, context):
args = self.eval_args(context)
inv = args[0]
return inv.reduce(convert.get_value, context.price_map, None)
class ValueInventoryWithDate(query_compile.EvalFunction):
"Coerce an inventory to its market value at a particular date."
__intypes__ = [inventory.Inventory, datetime.date]
def __init__(self, operands):
super().__init__(operands, inventory.Inventory)
def __call__(self, context):
args = self.eval_args(context)
inv, date = args
return inv.reduce(convert.get_value, context.price_map, date)
class Price(query_compile.EvalFunction):
"Fetch a price for something at a particular date"
__intypes__ = [str, str]
# Note: Don't provide this, because polymorphic multiplication on Amount,
# Position, Inventory isn't supported yet.
#
# class AccountSign(query_compile.EvalFunction):
# "Produce a +1 / -1 signed value to multiply with to correct balances."
# __intypes__ = [str]
#
# def __init__(self, operands):
# super().__init__(operands, Decimal)
#
# def __call__(self, context):
# args = self.eval_args(context)
# return Decimal(account_types.get_account_sign(args[0], context.account_types))
class CurrencyMeta(query_compile.EvalFunction):
"Get the metadata dict of the commodity directive of the currency."
__intypes__ = [str]
def __init__(self, operands):
super().__init__(operands, dict)
def __call__(self, context):
args = self.eval_args(context)
commodity_entry = context.commodity_map.get(args[0], None)
if commodity_entry is None:
return {}
return commodity_entry.meta
# Operation on inventories, positions and amounts.
return convert.get_value(pos, context.price_map, None)
class ValuePositionWithDate(query_compile.EvalFunction):
"Convert a position to its cost currency at the market value of a particular date."
__intypes__ = [position.Position, datetime.date]
def __init__(self, operands):
super().__init__(operands, amount.Amount)
def __call__(self, context):
args = self.eval_args(context)
pos, date = args
return convert.get_value(pos, context.price_map, date)
class ConvertInventory(query_compile.EvalFunction):
"Coerce an inventory to a particular currency."
__intypes__ = [inventory.Inventory, str]
def __init__(self, operands):
super().__init__(operands, inventory.Inventory)
def __call__(self, context):
args = self.eval_args(context)
inv, currency = args
return inv.reduce(convert.convert_position, currency, context.price_map, None)
class ConvertInventoryWithDate(query_compile.EvalFunction):
"Coerce an inventory to a particular currency."
__intypes__ = [inventory.Inventory, str, datetime.date]
def __init__(self, operands):
def __call__(self, context):
args = self.eval_args(context)
return account.root(args[1], args[0])
class Parent(query_compile.EvalFunction):
"Get the parent name of the account."
__intypes__ = [str]
def __init__(self, operands):
super().__init__(operands, str)
def __call__(self, context):
args = self.eval_args(context)
return account.parent(args[0])
class Leaf(query_compile.EvalFunction):
"Get the name of the leaf subaccount."
__intypes__ = [str]
def __init__(self, operands):
super().__init__(operands, str)
def __call__(self, context):
args = self.eval_args(context)
return account.leaf(args[0])
class Grep(query_compile.EvalFunction):
"Match a group against a string and return only the matched portion."
__intypes__ = [str, str]
def __init__(self, operands):
super().__init__(operands, str)
class LinksEntryColumn(query_compile.EvalColumn):
"The set of links of the transaction."
__equivalent__ = 'entry.links'
__intypes__ = [data.Transaction]
def __init__(self):
super().__init__(set)
def __call__(self, context):
return (context.entry.links or EMPTY_SET
if isinstance(context.entry, Transaction)
else EMPTY_SET)
class MatchAccount(query_compile.EvalFunction):
"""A predicate, true if the transaction has at least one posting matching
the regular expression argument."""
__intypes__ = [str]
def __init__(self, operands):
super().__init__(operands, bool)
def __call__(self, context):
pattern = self.eval_args(context)[0]
search = re.compile(pattern, re.IGNORECASE).search
return any(search(account) for account in getters.get_entry_accounts(context.entry))
# Functions defined only on entries.
ENTRY_FUNCTIONS = {
'has_account' : MatchAccount,
__intypes__ = [Decimal, Decimal]
def __init__(self, operands):
super().__init__(operands, Decimal)
def __call__(self, context):
args = self.eval_args(context)
try:
return args[0] / args[1]
except (decimal.DivisionByZero, decimal.InvalidOperation):
return ZERO
class SafeDivInt(SafeDiv):
__intypes__ = [Decimal, int]
class Length(query_compile.EvalFunction):
"Compute the length of the argument. This works on sequences."
__intypes__ = [(list, set, str)]
def __init__(self, operands):
super().__init__(operands, int)
def __call__(self, context):
args = self.eval_args(context)
return len(args[0])
class Str(query_compile.EvalFunction):
"Convert the argument to a string."
__intypes__ = [object]
def __init__(self, operands):
super().__init__(operands, str)
return convert.convert_amount(amount_, currency, context.price_map, None)
class ConvertAmountWithDate(query_compile.EvalFunction):
"Coerce an amount to a particular currency."
__intypes__ = [amount.Amount, str, datetime.date]
def __init__(self, operands):
super().__init__(operands, amount.Amount)
def __call__(self, context):
args = self.eval_args(context)
amount_, currency, date = args
return convert.convert_amount(amount_, currency, context.price_map, date)
class ConvertPosition(query_compile.EvalFunction):
"Coerce an amount to a particular currency."
__intypes__ = [position.Position, str]
def __init__(self, operands):
super().__init__(operands, amount.Amount)
def __call__(self, context):
args = self.eval_args(context)
pos, currency = args
return convert.convert_position(pos, currency, context.price_map, None)
class ConvertPositionWithDate(query_compile.EvalFunction):
"Coerce an amount to a particular currency."
__intypes__ = [position.Position, str, datetime.date]
def __init__(self, operands):
class MaxWidth(query_compile.EvalFunction):
"Convert the argument to a substring. This can be used to ensure maximum width"
__intypes__ = [str, int]
def __init__(self, operands):
super().__init__(operands, str)
def __call__(self, context):
string, width = self.eval_args(context)
return textwrap.shorten(string, width=width)
# Operations on dates.
class Year(query_compile.EvalFunction):
"Extract the year from a date."
__intypes__ = [datetime.date]
def __init__(self, operands):
super().__init__(operands, int)
def __call__(self, context):
args = self.eval_args(context)
return args[0].year
class Month(query_compile.EvalFunction):
"Extract the month from a date."
__intypes__ = [datetime.date]
def __init__(self, operands):
super().__init__(operands, int)
return inv.reduce(convert.convert_position, currency, context.price_map, None)
class ConvertInventoryWithDate(query_compile.EvalFunction):
"Coerce an inventory to a particular currency."
__intypes__ = [inventory.Inventory, str, datetime.date]
def __init__(self, operands):
super().__init__(operands, inventory.Inventory)
def __call__(self, context):
args = self.eval_args(context)
inv, currency, date = args
return inv.reduce(convert.convert_position, currency, context.price_map, date)
class ValueInventory(query_compile.EvalFunction):
"Coerce an inventory to its market value at the current date."
__intypes__ = [inventory.Inventory]
def __init__(self, operands):
super().__init__(operands, inventory.Inventory)
def __call__(self, context):
args = self.eval_args(context)
inv = args[0]
return inv.reduce(convert.get_value, context.price_map, None)
class ValueInventoryWithDate(query_compile.EvalFunction):
"Coerce an inventory to its market value at a particular date."
__intypes__ = [inventory.Inventory, datetime.date]
def __init__(self, operands):
args = self.eval_args(context)
return convert.get_cost(args[0])
class CostInventory(query_compile.EvalFunction):
"Get the cost of an inventory."
__intypes__ = [inventory.Inventory]
def __init__(self, operands):
super().__init__(operands, inventory.Inventory)
def __call__(self, context):
args = self.eval_args(context)
return args[0].reduce(convert.get_cost)
class ConvertAmount(query_compile.EvalFunction):
"Coerce an amount to a particular currency."
__intypes__ = [amount.Amount, str]
def __init__(self, operands):
super().__init__(operands, amount.Amount)
def __call__(self, context):
args = self.eval_args(context)
amount_, currency = args
return convert.convert_amount(amount_, currency, context.price_map, None)
class ConvertAmountWithDate(query_compile.EvalFunction):
"Coerce an amount to a particular currency."
__intypes__ = [amount.Amount, str, datetime.date]
def __init__(self, operands):