From ff4589caae7b5bd40350eac605916d085b5106cc Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Fri, 10 Sep 2004 20:08:07 -0400 Subject: [PATCH] added support for ValueExpr objects to python. --- format.cc | 11 ++++++++--- format.h | 2 +- main.py | 11 +++++++---- pyledger.cc | 2 ++ valexpr.cc | 32 ++++++++++++++++++++++++++++++++ 5 files changed, 50 insertions(+), 8 deletions(-) diff --git a/format.cc b/format.cc index 0f39b423..36b0bd16 100644 --- a/format.cc +++ b/format.cc @@ -14,11 +14,11 @@ std::string truncated(const std::string& str, unsigned int width) return buf; } -std::string partial_account_name(const account_t * account) +std::string partial_account_name(const account_t& account) { std::string name; - for (const account_t * acct = account; + for (const account_t * acct = &account; acct && acct->parent; acct = acct->parent) { if (acct->data && ACCT_DATA(acct)->dflags & ACCOUNT_DISPLAYED) @@ -284,7 +284,7 @@ void format_t::format(std::ostream& out, const details_t& details) const if (details.account) { std::string name = (elem->type == element_t::ACCOUNT_FULLNAME ? details.account->fullname() : - partial_account_name(details.account)); + partial_account_name(*details.account)); if (details.xact && details.xact->flags & TRANSACTION_VIRTUAL) { if (elem->max_width > 2) @@ -454,6 +454,11 @@ void export_format() .def("format", py_format) .def("format", py_format) ; + + def("truncated", truncated); +#if 0 + def("partial_account_name", partial_account_name); +#endif } #endif // USE_BOOST_PYTHON diff --git a/format.h b/format.h index 1e959931..df5dc49a 100644 --- a/format.h +++ b/format.h @@ -9,7 +9,7 @@ namespace ledger { std::string truncated(const std::string& str, unsigned int width); -std::string partial_account_name(const account_t * account, +std::string partial_account_name(const account_t& account, const unsigned int start_depth); struct element_t diff --git a/main.py b/main.py index 1e25b7ed..cad0e6e8 100644 --- a/main.py +++ b/main.py @@ -20,16 +20,19 @@ register_parser (parser) journal = Journal () parse_journal_file (args[0], journal) -class OutputTransaction (TransactionHandler): - def __init__ (self): - self.formatter = Format ("%D %-20P %N") +class FormatTransaction (TransactionHandler): + def __init__ (self, fmt): + self.formatter = Format (fmt) TransactionHandler.__init__ (self) + def __call__ (self, xact): print self.formatter.format(xact) -handler = OutputTransaction() +handler = FormatTransaction("%D %-20P %N") handler = FilterTransactions (handler, "/Checking/") +expr = parse_value_expr ("a*2") + for entry in journal: for xact in entry: handler (xact) diff --git a/pyledger.cc b/pyledger.cc index 41910044..d0f2a4be 100644 --- a/pyledger.cc +++ b/pyledger.cc @@ -19,6 +19,7 @@ void export_gnucash(); void export_option(); void export_walk(); void export_format(); +void export_valexpr(); void export_datetime(); BOOST_PYTHON_MODULE(ledger) { @@ -36,5 +37,6 @@ BOOST_PYTHON_MODULE(ledger) { export_option(); export_walk(); export_format(); + export_valexpr(); export_datetime(); } diff --git a/valexpr.cc b/valexpr.cc index 06f7dd09..f7763084 100644 --- a/valexpr.cc +++ b/valexpr.cc @@ -854,6 +854,38 @@ void dump_value_expr(std::ostream& out, const value_expr_t * node) } // namespace ledger +#ifdef USE_BOOST_PYTHON + +#include + +using namespace boost::python; +using namespace ledger; + +template +value_t py_compute(value_expr_t& value_expr, const T& item) { + value_t result; + value_expr.compute(result, details_t(item)); + return result; +} + +value_expr_t * py_parse_value_expr(const std::string& str) { + return parse_value_expr(str); +} + +void export_valexpr() +{ + class_< value_expr_t > ("ValueExpr", init()) + .def("compute", py_compute) + .def("compute", py_compute) + .def("compute", py_compute) + ; + + def("parse_value_expr", py_parse_value_expr, + return_value_policy()); +} + +#endif // USE_BOOST_PYTHON + #ifdef TEST int main(int argc, char *argv[])