diff options
author | John Wiegley <johnw@newartisans.com> | 2004-09-08 21:21:21 -0400 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2004-09-08 21:21:21 -0400 |
commit | 72d69d3ec90c1e0a3565d475a092d0f2051bd776 (patch) | |
tree | b82321de88bcd04ed32cf63f368a3365fcad3dd0 | |
parent | 3d4259e6d0ed01425ba9c35f3866fc298631c9e8 (diff) | |
download | fork-ledger-72d69d3ec90c1e0a3565d475a092d0f2051bd776.tar.gz fork-ledger-72d69d3ec90c1e0a3565d475a092d0f2051bd776.tar.bz2 fork-ledger-72d69d3ec90c1e0a3565d475a092d0f2051bd776.zip |
Python fixes; starting adding support for using item_handlers in python
-rw-r--r-- | format.cc | 20 | ||||
-rw-r--r-- | journal.cc | 9 | ||||
-rw-r--r-- | ledger.h | 7 | ||||
-rw-r--r-- | main.py | 10 | ||||
-rw-r--r-- | pyledger.cc | 4 | ||||
-rw-r--r-- | walk.cc | 122 |
6 files changed, 170 insertions, 2 deletions
@@ -431,3 +431,23 @@ bool format_account::display_account(const account_t& account, } } // namespace ledger + +#ifdef USE_BOOST_PYTHON + +#include <boost/python.hpp> + +using namespace boost::python; +using namespace ledger; + +void export_format() +{ +#if 0 + class_< format_transactions > ("FormatTransactions") + .def(init<item_handler<transaction_t> *>()) + .def("flush", &format_transactions::flush) + .def("__call__", &format_transactions::operator()); + ; +#endif +} + +#endif // USE_BOOST_PYTHON @@ -397,6 +397,11 @@ using namespace ledger; BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(journal_find_account_overloads, find_account, 1, 2) +entry_t& transaction_entry(const transaction_t& xact) +{ + return *xact.entry; +} + unsigned int transactions_len(entry_t& entry) { return entry.transactions.size(); @@ -504,7 +509,9 @@ void export_journal() class_< transaction_t > ("Transaction") .def(init<account_t *, amount_t, optional<unsigned int, std::string> >()) - .def_readwrite("entry", &transaction_t::entry) + .add_property("entry", + make_getter(&transaction_t::entry, + return_value_policy<reference_existing_object>())) .def_readwrite("account", &transaction_t::account) .def_readwrite("amount", &transaction_t::amount) .def_readwrite("cost", &transaction_t::cost) @@ -62,6 +62,13 @@ class transaction_t delete cost; } +#ifdef USE_BOOST_PYTHON + entry_t& get_entry() const { + assert(entry); + return *entry; + } +#endif + bool valid() const; }; @@ -19,5 +19,13 @@ register_parser (parser) journal = Journal () parse_journal_file (args[0], journal) +class OutputTransaction (TransactionHandler): + def __call__ (self, xact): + print xact.entry.payee + +handler = OutputTransaction() +chain = FilterTransactions (handler, "/Checking/") + for entry in journal: - print entry.payee + for xact in entry: + chain (xact) diff --git a/pyledger.cc b/pyledger.cc index d469c2f3..55cf0f3a 100644 --- a/pyledger.cc +++ b/pyledger.cc @@ -17,6 +17,8 @@ void export_qif(); void export_gnucash(); #endif void export_option(); +void export_walk(); +void export_format(); BOOST_PYTHON_MODULE(ledger) { export_amount(); @@ -31,4 +33,6 @@ BOOST_PYTHON_MODULE(ledger) { export_gnucash(); #endif export_option(); + export_walk(); + export_format(); } @@ -300,3 +300,125 @@ void dow_transactions::flush() } } // namespace ledger + +#ifdef USE_BOOST_PYTHON + +#include <boost/python.hpp> + +using namespace boost::python; +using namespace ledger; + +template <typename T> +struct item_handler_wrap : public item_handler<T> +{ + PyObject* self; + item_handler_wrap(PyObject * self_) : self(self_) {} + item_handler_wrap(PyObject * self_, const item_handler<T>& handler) + : item_handler<T>(const_cast<item_handler<T> *>(&handler)), self(self_) {} + + void flush() { + call_method<void>(self, "flush"); + } + void default_flush() { + item_handler<T>::flush(); + } + + void operator()(T& item) { + call_method<void>(self, "__call__", item); + } + void default_call(T& item) { + item_handler<T>::operator()(item); + } +}; + +void (subtotal_transactions::*subtotal_transactions_flush)() = + &subtotal_transactions::flush; + +void export_walk() +{ + class_< item_handler<transaction_t>, + item_handler_wrap<transaction_t> > ("TransactionHandler") + .def(init<item_handler<transaction_t> *>()) + + .def("flush", &item_handler<transaction_t>::flush, + &item_handler_wrap<transaction_t>::default_flush) + .def("__call__", &item_handler<transaction_t>::operator(), + &item_handler_wrap<transaction_t>::default_call) + ; + + class_< ignore_transactions > ("IgnoreTransactions") + .def("flush", &item_handler<transaction_t>::flush) + .def("__call__", &ignore_transactions::operator()); + ; + + class_< clear_transaction_data > ("ClearTransactionData") + .def("flush", &item_handler<transaction_t>::flush) + .def("__call__", &clear_transaction_data::operator()); + ; + + class_< set_account_value > + ("SetAccountValue", init<item_handler<transaction_t> *>()) + .def("flush", &item_handler<transaction_t>::flush) + .def("__call__", &set_account_value::operator()); + ; + +#if 0 + class_< sort_transactions > + ("SortTransactions", init<item_handler<transaction_t> *>()) + .def("flush", &sort_transactions::flush) + .def("__call__", &sort_transactions::operator()); + ; +#endif + + class_< filter_transactions > + ("FilterTransactions", init<item_handler<transaction_t> *, std::string>()) + .def("flush", &item_handler<transaction_t>::flush) + .def("__call__", &filter_transactions::operator()); + ; + + class_< calc_transactions > + ("CalcTransactions", init<item_handler<transaction_t> *, optional<bool> >()) + .def("flush", &item_handler<transaction_t>::flush) + .def("__call__", &calc_transactions::operator()); + ; + + class_< collapse_transactions > + ("CollapseTransactions", init<item_handler<transaction_t> *>()) + .def("flush", &collapse_transactions::flush) + .def("__call__", &collapse_transactions::operator()); + ; + + class_< changed_value_transactions > + ("ChangeValueTransactions", init<item_handler<transaction_t> *, bool>()) + .def("flush", &changed_value_transactions::flush) + .def("__call__", &changed_value_transactions::operator()); + ; + + class_< subtotal_transactions > + ("SubtotalTransactions", init<item_handler<transaction_t> *>()) + .def("flush", subtotal_transactions_flush) + .def("__call__", &subtotal_transactions::operator()); + ; + +#if 0 + class_< interval_transactions > + ("IntervalTransactions", init<item_handler<transaction_t> *>()) + .def("flush", &item_handler<transaction_t>::flush) + .def("__call__", &interval_transactions::operator()); + ; +#endif + + class_< dow_transactions > + ("DowTransactions", init<item_handler<transaction_t> *>()) + .def("flush", &dow_transactions::flush) + .def("__call__", &dow_transactions::operator()); + ; + + class_< related_transactions > + ("RelatedTransactions", init<item_handler<transaction_t> *, optional<bool> >()) + .def("flush", &item_handler<transaction_t>::flush) + .def("__call__", &related_transactions::operator()); + ; +} + +#endif // USE_BOOST_PYTHON |