r17284 - gnucash/trunk - Updated python bindings (r17263) for the gnucash API as of 2008-06-06.

Christian Stimming cstim at cvs.gnucash.org
Mon Jul 7 17:11:03 EDT 2008


Author: cstim
Date: 2008-07-07 17:11:02 -0400 (Mon, 07 Jul 2008)
New Revision: 17284
Trac: http://svn.gnucash.org/trac/changeset/17284

Added:
   gnucash/trunk/src/engine/engine-common.i
   gnucash/trunk/src/optional/python-bindings/gnucash_business.py
   gnucash/trunk/src/optional/python-bindings/tests/
   gnucash/trunk/src/optional/python-bindings/tests/Makefile.am
   gnucash/trunk/src/optional/python-bindings/tests/runTests.py
   gnucash/trunk/src/optional/python-bindings/tests/test_account.py
   gnucash/trunk/src/optional/python-bindings/tests/test_book.py
   gnucash/trunk/src/optional/python-bindings/tests/test_split.py
   gnucash/trunk/src/optional/python-bindings/tests/test_transaction.py
Modified:
   gnucash/trunk/configure.in
   gnucash/trunk/src/base-typemaps.i
   gnucash/trunk/src/engine/engine.i
   gnucash/trunk/src/optional/python-bindings/Makefile.am
   gnucash/trunk/src/optional/python-bindings/example_scripts/simple_test.py
   gnucash/trunk/src/optional/python-bindings/function_class.py
   gnucash/trunk/src/optional/python-bindings/glib.i
   gnucash/trunk/src/optional/python-bindings/gnucash_core.i
   gnucash/trunk/src/optional/python-bindings/gnucash_core.py
Log:
Updated python bindings (r17263) for the gnucash API as of 2008-06-06.

Copied from http://savannah.nongnu.org/projects/python-gnucash.


Modified: gnucash/trunk/configure.in
===================================================================
--- gnucash/trunk/configure.in	2008-07-07 20:57:36 UTC (rev 17283)
+++ gnucash/trunk/configure.in	2008-07-07 21:11:02 UTC (rev 17284)
@@ -1543,6 +1543,7 @@
           src/import-export/hbci/test/Makefile
           src/optional/Makefile
           src/optional/python-bindings/Makefile
+          src/optional/python-bindings/tests/Makefile
           src/optional/xsl/Makefile
           src/pixmaps/Makefile
           src/quotes/Makefile

Modified: gnucash/trunk/src/base-typemaps.i
===================================================================
--- gnucash/trunk/src/base-typemaps.i	2008-07-07 20:57:36 UTC (rev 17283)
+++ gnucash/trunk/src/base-typemaps.i	2008-07-07 21:11:02 UTC (rev 17284)
@@ -1,30 +1,17 @@
-%typemap(in) gboolean "$1 = SCM_NFALSEP($input) ? TRUE : FALSE;"
-%typemap(out) gboolean "$result = $1 ? SCM_BOOL_T : SCM_BOOL_F;"
-
-%typemap(in) Timespec "$1 = gnc_timepair2timespec($input);"
-%typemap(out) Timespec "$result = gnc_timespec2timepair($1);"
-
-%typemap(in) GUID "$1 = gnc_scm2guid($input);"
-%typemap(out) GUID "$result = gnc_guid2scm($1);"
-%typemap(in) GUID * (GUID g) " g = gnc_scm2guid($input); $1 = &g; "
-%typemap(out) GUID * " $result = ($1) ? gnc_guid2scm(*($1)): SCM_UNDEFINED; "
-
-%typemap(in) gnc_numeric "$1 = gnc_scm_to_numeric($input);"
-%typemap(out) gnc_numeric "$result = gnc_numeric_to_scm($1);"
-
-%typemap(in) gint64 " $1 = gnc_scm_to_gint64($input); "
-%typemap(out) gint64 " $result = gnc_gint64_to_scm($1); "
-
 /* Not sure why SWIG doesn't figure this out. */
-typedef void * gpointer;
 typedef int gint;
 typedef int time_t;
 typedef unsigned int guint;
 typedef double gdouble;
+typedef float gfloat;
 typedef char * URLType;
+typedef void * gpointer;
+
+%typemap(newfree) gchar * "g_free($1);"
+
+#if defined(SWIGGUILE)
 typedef char gchar;
 
-%typemap(newfree) gchar * "g_free($1);"
 %typemap (out) char * {
   $result = scm_makfrom0str((const char *)$1);
   if (!SCM_NFALSEP($result)) {
@@ -34,7 +21,23 @@
 %typemap(in) GNCPrintAmountInfo "$1 = gnc_scm2printinfo($input);"
 %typemap(out) GNCPrintAmountInfo "$result = gnc_printinfo2scm($1);"
 
+%typemap(in) gboolean "$1 = SCM_NFALSEP($input) ? TRUE : FALSE;"
+%typemap(out) gboolean "$result = $1 ? SCM_BOOL_T : SCM_BOOL_F;"
 
+%typemap(in) Timespec "$1 = gnc_timepair2timespec($input);"
+%typemap(out) Timespec "$result = gnc_timespec2timepair($1);"
+
+%typemap(in) GUID "$1 = gnc_scm2guid($input);"
+%typemap(out) GUID "$result = gnc_guid2scm($1);"
+%typemap(in) GUID * (GUID g) " g = gnc_scm2guid($input); $1 = &g; "
+%typemap(out) GUID * " $result = ($1) ? gnc_guid2scm(*($1)): SCM_UNDEFINED; "
+
+%typemap(in) gnc_numeric "$1 = gnc_scm_to_numeric($input);"
+%typemap(out) gnc_numeric "$result = gnc_numeric_to_scm($1);"
+
+%typemap(in) gint64 " $1 = gnc_scm_to_gint64($input); "
+%typemap(out) gint64 " $result = gnc_gint64_to_scm($1); "
+
 %define GLIST_HELPER_INOUT(ListType, ElemSwigType)
 %typemap(in) ListType * {
   SCM list = $input;
@@ -66,5 +69,87 @@
   $result = scm_reverse(list);
 }
 %enddef
+#elif defined(SWIGPYTHON) /* Typemaps for Python */
+%typemap(in) gint8, gint16, gint32, gint64, gshort, glong {
+    $1 = ($1_type)PyInt_AsLong($input);
+}
 
+%typemap(out) gint8, gint16, gint32, gint64, gshort, glong {
+    $result = PyInt_FromLong($1);
+}
 
+%typemap(in) guint8, guint16, guint32, guint64, gushort, gulong {
+    $1 = ($1_type)PyLong_AsUnsignedLong($input);
+}
+
+%typemap(out) guint8, guint16, guint32, guint64, gushort, gulong {
+    $result = PyLong_FromUnsignedLong($1);
+}
+
+%typemap(in) gchar * {
+    $1 = ($1_type)PyString_AsString($input);
+}
+
+%typemap(out) gchar * {
+    $result = PyString_FromString($1);
+}
+
+%typemap(in) gboolean {
+    if ($input == Py_True)
+        $1 = TRUE;
+    else if ($input == Py_False)
+        $1 = FALSE;
+    else
+    {
+        PyErr_SetString(
+            PyExc_ValueError,
+            "Python object passed to a gboolean argument was not True "
+            "or False" );
+        return NULL;
+    }
+}
+
+%typemap(out) gboolean {
+    if ($1 == TRUE)
+    {
+        Py_INCREF(Py_True);
+        $result = Py_True;
+    }
+    else if ($1 == FALSE)
+    {
+        Py_INCREF(Py_False);
+        $result = Py_False;
+    }
+    else
+    {
+        PyErr_SetString(
+            PyExc_ValueError,
+            "function returning gboolean returned a value that wasn't "
+            "TRUE or FALSE.");
+        return NULL;        
+    }
+}
+
+%typemap(out) GList *, CommodityList *, SplitList *, AccountList *, LotList * {
+    guint i;
+    gpointer data;
+    PyObject *list = PyList_New(0);
+    for (i = 0; i < g_list_length($1); i++)
+    {
+        data = g_list_nth_data($1, i);        
+        if (GNC_IS_ACCOUNT(data))
+            PyList_Append(list, SWIG_NewPointerObj(data, SWIGTYPE_p_Account, 0)); 
+        else if (GNC_IS_SPLIT(data))
+            PyList_Append(list, SWIG_NewPointerObj(data, SWIGTYPE_p_Split, 0)); 
+        else if (GNC_IS_TRANSACTION(data))
+            PyList_Append(list, SWIG_NewPointerObj(data, SWIGTYPE_p_Transaction, 0)); 
+        else if (GNC_IS_COMMODITY(data))
+            PyList_Append(list, SWIG_NewPointerObj(data, SWIGTYPE_p_gnc_commodity, 0)); 
+        else if (GNC_IS_LOT(data))
+            PyList_Append(list, SWIG_NewPointerObj(data, SWIGTYPE_p_GNCLot, 0)); 
+        else
+            PyList_Append(list, SWIG_NewPointerObj(data, SWIGTYPE_p_void, 0)); 
+    }
+    $result = list;
+}
+#endif

Added: gnucash/trunk/src/engine/engine-common.i
===================================================================
--- gnucash/trunk/src/engine/engine-common.i	                        (rev 0)
+++ gnucash/trunk/src/engine/engine-common.i	2008-07-07 21:11:02 UTC (rev 17284)
@@ -0,0 +1,31 @@
+%inline %{
+static const GUID * gncSplitGetGUID(Split *x)
+{ return qof_instance_get_guid(QOF_INSTANCE(x)); }
+static const GUID * gncTransGetGUID(Transaction *x)
+{ return qof_instance_get_guid(QOF_INSTANCE(x)); }
+static const GUID * gncAccountGetGUID(Account *x)
+{ return qof_instance_get_guid(QOF_INSTANCE(x)); }
+%}
+
+%typemap(newfree) AccountList * "g_list_free($1);"
+%typemap(newfree) SplitList * "g_list_free($1);"
+%typemap(newfree) TransList * "g_list_free($1);"
+%typemap(newfree) PriceList * "g_list_free($1);"
+%typemap(newfree) LotList * "g_list_free($1);"
+%typemap(newfree) CommodityList * "g_list_free($1);"
+
+%include <Split.h>
+
+AccountList * gnc_account_get_children (const Account *account);
+AccountList * gnc_account_get_children_sorted (const Account *account);
+AccountList * gnc_account_get_descendants (const Account *account);
+AccountList * gnc_account_get_descendants_sorted (const Account *account);
+%ignore gnc_account_get_children;
+%ignore gnc_account_get_children_sorted;
+%ignore gnc_account_get_descendants;
+%ignore gnc_account_get_descendants_sorted;
+%include <Account.h>
+
+%include <Transaction.h>
+
+%include <gnc-lot.h>

Modified: gnucash/trunk/src/engine/engine.i
===================================================================
--- gnucash/trunk/src/engine/engine.i	2008-07-07 20:57:36 UTC (rev 17283)
+++ gnucash/trunk/src/engine/engine.i	2008-07-07 21:11:02 UTC (rev 17284)
@@ -23,7 +23,15 @@
 
 %import "base-typemaps.i"
 
+%include "engine-common.i"
 
+%inline %{
+static const GUID * gncPriceGetGUID(GNCPrice *x)
+{ return qof_instance_get_guid(QOF_INSTANCE(x)); }
+static const GUID * gncBudgetGetGUID(GncBudget *x)
+{ return qof_instance_get_guid(QOF_INSTANCE(x)); }
+%}
+
 GLIST_HELPER_INOUT(SplitList, SWIGTYPE_p_Split);
 GLIST_HELPER_INOUT(TransList, SWIGTYPE_p_Transaction);
 GLIST_HELPER_INOUT(LotList, SWIGTYPE_p_GNCLot);
@@ -32,27 +40,6 @@
 // TODO: free PriceList?
 GLIST_HELPER_INOUT(CommodityList, SWIGTYPE_p_gnc_commodity);
 
-
-%inline %{
-static const GUID * gncSplitGetGUID(Split *x)
-{ return qof_instance_get_guid(QOF_INSTANCE(x)); }
-static const GUID * gncTransGetGUID(Transaction *x)
-{ return qof_instance_get_guid(QOF_INSTANCE(x)); }
-static const GUID * gncAccountGetGUID(Account *x)
-{ return qof_instance_get_guid(QOF_INSTANCE(x)); }
-static const GUID * gncPriceGetGUID(GNCPrice *x)
-{ return qof_instance_get_guid(QOF_INSTANCE(x)); }
-static const GUID * gncBudgetGetGUID(GncBudget *x)
-{ return qof_instance_get_guid(QOF_INSTANCE(x)); }
-%}
-
-%typemap(newfree) AccountList * "g_list_free($1);"
-%typemap(newfree) SplitList * "g_list_free($1);"
-%typemap(newfree) TransList * "g_list_free($1);"
-%typemap(newfree) PriceList * "g_list_free($1);"
-%typemap(newfree) LotList * "g_list_free($1);"
-%typemap(newfree) CommodityList * "g_list_free($1);"
-
 %typemap(newfree) gchar * "g_free($1);"
 
 /* NB: The object ownership annotations should already cover all the
@@ -83,18 +70,7 @@
   static QofIdType QOF_ID_BOOK_SCM (void) { return QOF_ID_BOOK; }
 }
 
-%include <Split.h>
 %include <engine-helpers.h>
-AccountList * gnc_account_get_children (const Account *account);
-AccountList * gnc_account_get_children_sorted (const Account *account);
-AccountList * gnc_account_get_descendants (const Account *account);
-AccountList * gnc_account_get_descendants_sorted (const Account *account);
-%ignore gnc_account_get_children;
-%ignore gnc_account_get_children_sorted;
-%ignore gnc_account_get_descendants;
-%ignore gnc_account_get_descendants_sorted;
-%include <Account.h>
-%include <Transaction.h>
 %include <gnc-pricedb.h>
 
 QofSession * qof_session_new (void);
@@ -193,7 +169,6 @@
 %ignore gnc_quote_source_set_fq_installed;
 %include <gnc-commodity.h>
 
-%include <gnc-lot.h>
 %include <gnc-session-scm.h>
 void gnc_hook_add_scm_dangler (const gchar *name, SCM proc);
 void gnc_hook_run (const gchar *name, gpointer data);

Modified: gnucash/trunk/src/optional/python-bindings/Makefile.am
===================================================================
--- gnucash/trunk/src/optional/python-bindings/Makefile.am	2008-07-07 20:57:36 UTC (rev 17283)
+++ gnucash/trunk/src/optional/python-bindings/Makefile.am	2008-07-07 21:11:02 UTC (rev 17284)
@@ -1,3 +1,5 @@
+SUBDIRS = . tests
+
 BUILT_SOURCES = gnucash_core.c
 SWIG_SOURCES = gnucash_core.i
 
@@ -2,3 +4,3 @@
 pkgpython_PYTHON = __init__.py function_class.py \
-gnucash_core.py gnucash_core_c.py
+gnucash_core.py gnucash_core_c.py gnucash_business.py
 
@@ -9,7 +11,8 @@
 _gnucash_core_c_la_CPPFLAGS = $(PYTHON_CPPFLAGS) \
                               -I$(top_srcdir)/src $(QOF_CFLAGS) \
                               $(GLIB_CFLAGS) $(GUILE_INCS) \
-							  -I$(top_srcdir)/src/engine 
+							  -I$(top_srcdir)/src/engine \
+							  -I$(top_srcdir)/src/business/business-core 
 
 # Suppress all warnings for now, but we really only need to -Wno-implicit
 AM_CFLAGS = -w
@@ -17,9 +20,11 @@
 _gnucash_core_c_la_LDFLAGS = -avoid-version -module
 _gnucash_core_c_la_LIBADD = ${QOF_LIBS} ${GUILE_LIBS} ${GLIB_LIBS} \
     ${top_builddir}/src/gnc-module/libgnc-module.la \
-	${top_builddir}/src/engine/libgncmod-engine.la
+	${top_builddir}/src/engine/libgncmod-engine.la \
+	${top_builddir}/src/business/business-core/libgncmod-business-core.la
 
 gnucash_core.c : $(SWIG_SOURCES)
-	$(SWIG) $(SWIG_PYTHON_OPT) -Wall -Werror \
+	swig $(SWIG_PYTHON_OPT) -Wall -Werror \
         -I$(top_srcdir)/src -I$(top_srcdir)/src/engine \
+		-I$(top_srcdir)/src/business/business-core \
 		$(QOF_CFLAGS) -o $@ $<

Modified: gnucash/trunk/src/optional/python-bindings/example_scripts/simple_test.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/example_scripts/simple_test.py	2008-07-07 20:57:36 UTC (rev 17283)
+++ gnucash/trunk/src/optional/python-bindings/example_scripts/simple_test.py	2008-07-07 21:11:02 UTC (rev 17284)
@@ -1,49 +1,78 @@
 #!/usr/bin/env python
+# Creates a basic set of accounts and a couple of transactions
 
-from gnucash import \
-     Session, Account, Transaction, Split, GncCommodity, GncNumeric
-     
+import gnucash
 
 FILE_1 = "/tmp/example.xac"
 
 session = None
-session = Session("file:%s" % FILE_1, True)
+session = gnucash.Session("file:%s" % FILE_1, True)
 
 book = session.book
-root_account = book.get_root_account()
-acct1 = Account(book)
-acct2 = Account(book)
-trans = Transaction(book)
-split1 = Split(book)
-split2 = Split(book)
-comm = GncCommodity(book, "Canadian Dollars", "CURRENCY", "CAD", None, 100)
-debit_num = GncNumeric(4, 1)
-credit_num = debit_num.neg()
+root_acct = gnucash.Account(book)
+expenses_acct = gnucash.Account(book)
+savings_acct = gnucash.Account(book)
+opening_acct = gnucash.Account(book)
+trans1 = gnucash.Transaction(book)
+trans2 = gnucash.Transaction(book)
+split1 = gnucash.Split(book)
+split3 = gnucash.Split(book)
+comm = gnucash.GncCommodity(book, "Canadian Dollars", "CURRENCY", "CAD", None, 100)
+num1 = gnucash.GncNumeric(4, 1)
+num2 = gnucash.GncNumeric(100, 1)
 
-acct1.SetCommodity(comm)
-acct1.SetName("Savings")
-root_account.append_child(acct1)
+#Set new root account
+book.set_root_account(root_acct)
 
-acct2.SetCommodity(comm)
-acct2.SetName("Food expenses")
-root_account.append_child(acct2)
+#Set up root account and add sub-accounts
+root_acct.SetName("Root")
+root_acct.SetType(13) #ACCT_TYPE_ROOT = 13
+root_acct.append_child(expenses_acct)
+root_acct.append_child(savings_acct)
+root_acct.append_child(opening_acct)
 
-split1.SetValue(credit_num)
-split1.SetAccount(acct1)
-split1.SetParent(trans)
+#Set up Expenses account
+expenses_acct.SetCommodity(comm)
+expenses_acct.SetName("Expenses")
+expenses_acct.SetType(9) #ACCT_TYPE_EXPENSE = 9
 
-split2.SetValue(debit_num)
-split2.SetAccount(acct2)
-split2.SetParent(trans)
+#Set up Savings account
+savings_acct.SetCommodity(comm)
+savings_acct.SetName("Savings")
+savings_acct.SetType(0) #ACCT_TYPE_BANK = 0
 
-trans.SetCurrency(comm)
-trans.SetDescription("Groceries")
+#Set up Opening Balance account
+opening_acct.SetCommodity(comm)
+opening_acct.SetName("Opening Balance")
+opening_acct.SetType(10) #ACCT_TYPE_EQUITY = 10
 
+split1.SetValue(num1)
+split1.SetAccount(expenses_acct)
+split1.SetParent(trans1)
+
+split3.SetValue(num2)
+split3.SetAccount(savings_acct)
+split3.SetParent(trans2)
+
+trans1.SetCurrency(comm)
+trans1.SetDescription("Groceries")
+
+trans2.SetCurrency(comm)
+trans2.SetDescription("Opening Savings Balance")
+
+split2 = split1.GetOtherSplit()
+split2.SetAccount(savings_acct)
+
+split4 = split3.GetOtherSplit()
+split4.SetAccount(opening_acct)
+
 book.print_dirty()
 
 book.mark_saved()
 book.mark_closed()
 
+book.print_dirty()
+
 session.save()
 session.end()
 session.destroy()

Modified: gnucash/trunk/src/optional/python-bindings/function_class.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/function_class.py	2008-07-07 20:57:36 UTC (rev 17283)
+++ gnucash/trunk/src/optional/python-bindings/function_class.py	2008-07-07 21:11:02 UTC (rev 17284)
@@ -165,3 +165,12 @@
         if attr_name.startswith(prefix):
             after_prefix = attr_name[ len(prefix): ]
             yield attr_name, attr_value, after_prefix
+
+def methods_return_instance(cls, function_dict):
+    """Iterates through a dictionary of function name strings and instance names
+    and sets the function to return the associated instance 
+    """
+    for func_name, instance_name in function_dict.iteritems():
+        setattr(cls, func_name, 
+            method_function_returns_instance( getattr(cls, func_name), instance_name))
+

Modified: gnucash/trunk/src/optional/python-bindings/glib.i
===================================================================
--- gnucash/trunk/src/optional/python-bindings/glib.i	2008-07-07 20:57:36 UTC (rev 17283)
+++ gnucash/trunk/src/optional/python-bindings/glib.i	2008-07-07 21:11:02 UTC (rev 17284)
@@ -90,3 +90,26 @@
         return NULL;        
     }
 }
+
+%typemap(out) GList *, CommodityList *, SplitList *, AccountList *, LotList * {
+    guint i;
+    gpointer data;
+    PyObject *list = PyList_New(0);
+    for (i = 0; i < g_list_length($1); i++)
+    {
+        data = g_list_nth_data($1, i);        
+        if (GNC_IS_ACCOUNT(data))
+            PyList_Append(list, SWIG_NewPointerObj(data, SWIGTYPE_p_Account, 0)); 
+        else if (GNC_IS_SPLIT(data))
+            PyList_Append(list, SWIG_NewPointerObj(data, SWIGTYPE_p_Split, 0)); 
+        else if (GNC_IS_TRANSACTION(data))
+            PyList_Append(list, SWIG_NewPointerObj(data, SWIGTYPE_p_Transaction, 0)); 
+        else if (GNC_IS_COMMODITY(data))
+            PyList_Append(list, SWIG_NewPointerObj(data, SWIGTYPE_p_gnc_commodity, 0)); 
+        else if (GNC_IS_LOT(data))
+            PyList_Append(list, SWIG_NewPointerObj(data, SWIGTYPE_p_GNCLot, 0)); 
+        else
+            PyList_Append(list, SWIG_NewPointerObj(data, SWIGTYPE_p_gpointer, 0)); 
+    }
+    $result = list;
+}

Added: gnucash/trunk/src/optional/python-bindings/gnucash_business.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/gnucash_business.py	                        (rev 0)
+++ gnucash/trunk/src/optional/python-bindings/gnucash_business.py	2008-07-07 21:11:02 UTC (rev 17284)
@@ -0,0 +1,92 @@
+# gnucash_business.py -- High level python wrapper classes for the business
+#                        parts of GnuCash
+#
+# Copyright (C) 2008 ParIT Worker Co-operative <paritinfo at parit.ca>
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, contact:
+# Free Software Foundation           Voice:  +1-617-542-5942
+# 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652
+# Boston, MA  02110-1301,  USA       gnu at gnu.org
+#
+# @author Mark Jenkins, ParIT Worker Co-operative <mark at parit.ca>
+# @author Jeff Green,   ParIT Worker Co-operative <jeff at parit.ca>
+
+import gnucash_core_c
+
+from function_class import \
+     ClassFromFunctions, extract_attributes_with_prefix, \
+     default_arguments_decorator, method_function_returns_instance, \
+     methods_return_instance
+
+from gnucash_core import \
+     GnuCashCoreClass, GncNumeric, GncCommodity, Transaction, \
+     Split, Book
+
+class Customer(GnuCashCoreClass): pass
+
+class Employee(GnuCashCoreClass): pass
+
+class Vendor(GnuCashCoreClass): pass
+
+class Address(GnuCashCoreClass): pass
+    
+class BillTerm(GnuCashCoreClass): pass
+
+# Customer
+Customer.add_constructor_and_methods_with_prefix('gncCustomer', 'Create')
+
+customer_dict = {
+                    'GetAddr' : Address,
+                    'GetShipAddr' : Address,
+                    'GetDiscount' : GncNumeric,
+                    'GetCredit' : GncNumeric,
+                    'GetTerms' : BillTerm,
+                    'GetCurrency' : GncCommodity
+                }
+methods_return_instance(Customer, customer_dict)
+
+# Employee
+Employee.add_constructor_and_methods_with_prefix('gncEmployee', 'Create')
+
+employee_dict = {
+                    'GetBook' : Book,
+                    'GetAddr' : Address,
+                    'GetWorkday' : GncNumeric,
+                    'GetRate' : GncNumeric,
+                    'GetCurrency' : GncCommodity
+                }
+methods_return_instance(Employee, employee_dict)
+
+# Vendor
+Vendor.add_constructor_and_methods_with_prefix('gncVendor', 'Create')
+
+vendor_dict =   {
+                    'GetAddr' : Address,
+                    'GetTerms' : BillTerm,
+                    'GetCurrency' : GncCommodity
+                }
+methods_return_instance(Vendor, vendor_dict)
+
+# Address
+Address.add_constructor_and_methods_with_prefix('gncAddress', 'Create')
+
+# BillTerm
+BillTerm.add_constructor_and_methods_with_prefix('gncBillTerm', 'Create')
+
+billterm_dict = {
+                    'LookupByName' : BillTerm,
+                    'GetDiscount' : GncNumeric,
+                    'GetParent' : BillTerm,
+                    'ReturnChild' : BillTerm
+                }
+methods_return_instance(BillTerm, billterm_dict)

Modified: gnucash/trunk/src/optional/python-bindings/gnucash_core.i
===================================================================
--- gnucash/trunk/src/optional/python-bindings/gnucash_core.i	2008-07-07 20:57:36 UTC (rev 17283)
+++ gnucash/trunk/src/optional/python-bindings/gnucash_core.i	2008-07-07 21:11:02 UTC (rev 17284)
@@ -32,19 +32,28 @@
 #include "qofsession.h"
 #include "qofbook.h"
 #include "qofbackend.h"
+#include "qofid.h"
+#include "guid.h"
+#include "Transaction.h"
+#include "Split.h"
+#include "Account.h"
 #include "gnc-commodity.h"
 #include "gnc-lot.h"
 #include "gnc-numeric.h"
-#include "Transaction.h"
-#include "Split.h"
-#include "Account.h"
+#include "gncCustomer.h"
+#include "gncEmployee.h"
+#include "gncVendor.h"
+#include "gncAddress.h"
+#include "gncBillTerm.h"
 #include <guile/gh.h>
 %}
 
 %include <timespec.i>
 
-%include <glib.i>
+%include <base-typemaps.i>
 
+%include <engine-common.i>
+
 %include <qofbackend.h>
 
 // this function is defined in qofsession.h, but isnt found in the libraries,
@@ -54,9 +63,15 @@
 
 %include <qofbook.h>
 
-%include <Transaction.h>
+%include <qofid.h>
+
+/* SWIG doesn't like this macro, so redefine it to simply mean const */
+#define G_CONST_RETURN const
+%include <guid.h>
+
+/* %include <Transaction.h>
 %include <Split.h>
-%include <Account.h>
+%include <Account.h> */
 
 //Ignored because it is unimplemented
 %ignore gnc_numeric_convert_with_error;
@@ -64,8 +79,15 @@
 
 %include <gnc-commodity.h>
 
-%include <gnc-lot.h>
+/* %include <gnc-lot.h> */
 
+//business-core includes
+%include <gncCustomer.h>
+%include <gncEmployee.h>
+%include <gncVendor.h>
+%include <gncAddress.h>
+%include <gncBillTerm.h>
+
 %init %{
 
 g_type_init();

Modified: gnucash/trunk/src/optional/python-bindings/gnucash_core.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/gnucash_core.py	2008-07-07 20:57:36 UTC (rev 17283)
+++ gnucash/trunk/src/optional/python-bindings/gnucash_core.py	2008-07-07 21:11:02 UTC (rev 17284)
@@ -25,7 +25,8 @@
 
 from function_class import \
      ClassFromFunctions, extract_attributes_with_prefix, \
-     default_arguments_decorator, method_function_returns_instance
+     default_arguments_decorator, method_function_returns_instance, \
+     methods_return_instance
 
 class GnuCashCoreClass(ClassFromFunctions):
     _module = gnucash_core_c
@@ -118,9 +119,7 @@
     def __init__(self, book, name=None, namespace=None, mnemonic=None, cusip=None, fraction=1, **kargs):
         GnuCashCoreClass.__init__(self, book, name, namespace, mnemonic, cusip, fraction, **kargs)
 
-class GncCommodityTable(GnuCashCoreClass):
-    def __init__(self, book, **kargs):
-        GnuCashCoreClass.__init__(self, book, **kargs)
+class GncCommodityTable(GnuCashCoreClass): pass
 
 class GncLot(GnuCashCoreClass):
     def __init__(self, book, **kargs):
@@ -128,13 +127,20 @@
 
 class Transaction(GnuCashCoreClass):
     _new_instance = 'xaccMallocTransaction'
+    def GetNthSplit(self, n):
+        return self.GetSplitList().pop(n)
 
 class Split(GnuCashCoreClass):
     _new_instance = 'xaccMallocSplit'
 
 class Account(GnuCashCoreClass):
     _new_instance = 'xaccMallocAccount'
+    def GetNthChild(self, n):
+        return self.get_children().pop(n)
 
+class GUID(GnuCashCoreClass):
+    _new_instance = 'guid_new_return'
+
 # Session
 Session.add_constructor_and_methods_with_prefix('qof_session_', 'new')
 
@@ -158,44 +164,33 @@
 #Book
 Book.add_constructor_and_methods_with_prefix('qof_book_', 'new')
 Book.add_method('gnc_book_get_root_account', 'get_root_account')
+Book.add_method('gnc_book_set_root_account', 'set_root_account')
 #Functions that return Account
 Book.get_root_account = method_function_returns_instance(
     Book.get_root_account, Account )
 
 # GncNumeric
 GncNumeric.add_constructor_and_methods_with_prefix('gnc_numeric_', 'create')
-#Functions that return GncNumeric
-GncNumeric.same = method_function_returns_instance(
-    GncNumeric.same, GncNumeric )
-GncNumeric.add = method_function_returns_instance(
-    GncNumeric.add, GncNumeric )
-GncNumeric.sub = method_function_returns_instance(
-    GncNumeric.sub, GncNumeric )
-GncNumeric.mul = method_function_returns_instance(
-    GncNumeric.mul, GncNumeric )
-GncNumeric.div = method_function_returns_instance(
-    GncNumeric.div, GncNumeric )
-GncNumeric.neg = method_function_returns_instance(
-    GncNumeric.neg, GncNumeric )
-GncNumeric.abs = method_function_returns_instance(
-    GncNumeric.abs, GncNumeric )
-GncNumeric.add_fixed = method_function_returns_instance(
-    GncNumeric.add_fixed, GncNumeric )
-GncNumeric.sub_fixed = method_function_returns_instance(
-    GncNumeric.sub_fixed, GncNumeric )
-GncNumeric.add_with_error = method_function_returns_instance(
-    GncNumeric.add_with_error, GncNumeric )
-GncNumeric.sub_with_error = method_function_returns_instance(
-    GncNumeric.sub_with_error, GncNumeric )
-GncNumeric.mul_with_error = method_function_returns_instance(
-    GncNumeric.mul_with_error, GncNumeric )
-GncNumeric.div_with_error = method_function_returns_instance(
-    GncNumeric.div_with_error, GncNumeric )
-GncNumeric.convert = method_function_returns_instance(
-    GncNumeric.convert, GncNumeric )
-GncNumeric.reduce = method_function_returns_instance(
-    GncNumeric.reduce, GncNumeric )
 
+gncnumeric_dict =   { 
+                        'same' : GncNumeric, 
+                        'add' : GncNumeric, 
+                        'sub' : GncNumeric, 
+                        'mul' : GncNumeric, 
+                        'div' : GncNumeric, 
+                        'neg' : GncNumeric, 
+                        'abs' : GncNumeric, 
+                        'add_fixed' : GncNumeric, 
+                        'sub_fixed' : GncNumeric, 
+                        'add_with_error' : GncNumeric, 
+                        'sub_with_error' : GncNumeric, 
+                        'mul_with_error' : GncNumeric, 
+                        'div_with_error' : GncNumeric, 
+                        'convert' : GncNumeric, 
+                        'reduce' : GncNumeric 
+                    }
+methods_return_instance(GncNumeric, gncnumeric_dict)
+
 # GncCommodity
 GncCommodity.add_constructor_and_methods_with_prefix('gnc_commodity_', 'new')
 #Functions that return GncCommodity
@@ -204,171 +199,111 @@
 
 # GncCommodityTable
 GncCommodityTable.add_constructor_and_methods_with_prefix('gnc_commodity_table_', 'get_table')
-#Functions that return GncCommodity
-GncCommodityTable.lookup = method_function_returns_instance(
-    GncCommodityTable.lookup, GncCommodity )
-GncCommodityTable.lookup_unique = method_function_returns_instance(
-    GncCommodityTable.lookup_unique, GncCommodity )
-GncCommodityTable.find_full = method_function_returns_instance(
-    GncCommodityTable.find_full, GncCommodity )
-GncCommodityTable.insert = method_function_returns_instance(
-    GncCommodityTable.insert, GncCommodity )
 
+commoditytable_dict =   { 
+                            'lookup' : GncCommodity, 
+                            'lookup_unique' : GncCommodity, 
+                            'find_full' : GncCommodity, 
+                            'insert' : GncCommodity 
+                        }
+methods_return_instance(GncCommodityTable, commoditytable_dict)
+
 # GncLot
 GncLot.add_constructor_and_methods_with_prefix('gnc_lot_', 'new')
-#Functions that return Account
-GncLot.get_account = method_function_returns_instance(
-    GncLot.get_account, Account )
-#Functions that return Book
-GncLot.get_book = method_function_returns_instance(
-    GncLot.get_book, Book )
-#Functions that return Split
-GncLot.get_earliest_split = method_function_returns_instance(
-    GncLot.get_earliest_split, Split )
-GncLot.get_latest_split = method_function_returns_instance(
-    GncLot.get_latest_split, Split )
-#Functions that return GncNumeric
-GncLot.get_balance = method_function_returns_instance(
-    GncLot.get_balance, GncNumeric )
-#Functions that return GncLot
-GncLot.lookup = method_function_returns_instance(
-    GncLot.lookup, GncLot )
-GncLot.make_default = method_function_returns_instance(
-    GncLot.make_default, GncLot )
 
+gnclot_dict =   { 
+                    'get_account' : Account, 
+                    'get_book' : Book, 
+                    'get_earliest_split' : Split, 
+                    'get_latest_split' : Split, 
+                    'get_balance' : GncNumeric, 
+                    'lookup' : GncLot, 
+                    'make_default' : GncLot 
+                }
+methods_return_instance(GncLot, gnclot_dict)
 
 # Transaction
 Transaction.add_methods_with_prefix('xaccTrans')
-#Functions that return Split
-Transaction.GetSplit = method_function_returns_instance(
-    Transaction.GetSplit, Split )
-Transaction.FindSplitByAccount = method_function_returns_instance(
-    Transaction.FindSplitByAccount, Split )
-#Functions that return Transaction
-Transaction.Clone = method_function_returns_instance(
-    Transaction.Clone, Transaction )
-Transaction.Reverse = method_function_returns_instance(
-    Transaction.Reverse, Transaction )
-Transaction.GetReversedBy = method_function_returns_instance(
-    Transaction.GetReversedBy, Transaction )
-#Functions that return GncCommodity
-Transaction.GetCurrency = method_function_returns_instance(
-    Transaction.GetCurrency, GncCommodity )
-#Functions that return GncNumeric
-Transaction.GetImbalance = method_function_returns_instance(
-    Transaction.GetImbalance, GncNumeric )
-Transaction.GetAccountValue = method_function_returns_instance(
-    Transaction.GetAccountValue, GncNumeric )
-Transaction.GetAccountAmount = method_function_returns_instance(
-    Transaction.GetAccountAmount, GncNumeric )
-Transaction.GetAccountConvRate = method_function_returns_instance(
-    Transaction.GetAccountConvRate, GncNumeric )
-Transaction.GetAccountBalance = method_function_returns_instance(
-    Transaction.GetAccountBalance, GncNumeric )
 
+trans_dict =    {
+                    'GetSplit': Split, 
+                    'FindSplitByAccount': Split, 
+                    'GetNthSplit': Split, 
+                    'Clone': Transaction, 
+                    'Reverse': Transaction, 
+                    'GetReversedBy': Transaction, 
+                    'GetImbalance': GncNumeric, 
+                    'GetAccountValue': GncNumeric, 
+                    'GetAccountAmount': GncNumeric, 
+                    'GetAccountConvRate': GncNumeric, 
+                    'GetAccountBalance': GncNumeric, 
+                    'GetCurrency': GncCommodity 
+                }
+methods_return_instance(Transaction, trans_dict)
+
 # Split
 Split.add_methods_with_prefix('xaccSplit')
-#Functions that return Book
-Split.GetBook = method_function_returns_instance(
-    Split.GetBook, Book )
-#Functions that return Account
-Split.GetAccount = method_function_returns_instance(
-    Split.GetAccount, Account )
-#Functions that return Transaction
-Split.GetParent = method_function_returns_instance(
-    Split.GetParent, Transaction )
-#Functions that return Split
-Split.Lookup = method_function_returns_instance(
-    Split.Lookup, Split )
-Split.GetOtherSplit = method_function_returns_instance(
-    Split.GetOtherSplit, Split )
-#Functions that return GncNumeric
-Split.GetAmount = method_function_returns_instance(
-    Split.GetAmount, GncNumeric )
-Split.GetValue = method_function_returns_instance(
-    Split.GetValue, GncNumeric )
-Split.GetSharePrice = method_function_returns_instance(
-    Split.GetSharePrice, GncNumeric )
-Split.ConvertAmount = method_function_returns_instance(
-    Split.ConvertAmount, GncNumeric )
-Split.GetBaseValue = method_function_returns_instance(
-    Split.GetBaseValue, GncNumeric )
-Split.GetBalance = method_function_returns_instance(
-    Split.GetBalance, GncNumeric )
-Split.GetClearedBalance = method_function_returns_instance(
-    Split.GetClearedBalance, GncNumeric )
-Split.GetReconciledBalance = method_function_returns_instance(
-    Split.GetReconciledBalance, GncNumeric )
-Split.VoidFormerAmount = method_function_returns_instance(
-    Split.VoidFormerAmount, GncNumeric )
-Split.VoidFormerValue = method_function_returns_instance(
-    Split.VoidFormerValue, GncNumeric )
 
+split_dict =    {
+                    'GetBook': Book, 
+                    'GetAccount': Account, 
+                    'GetParent': Transaction, 
+                    'Lookup': Split, 
+                    'GetOtherSplit': Split, 
+                    'GetAmount': GncNumeric, 
+                    'GetValue': GncNumeric, 
+                    'GetSharePrice': GncNumeric, 
+                    'ConvertAmount': GncNumeric, 
+                    'GetBaseValue': GncNumeric, 
+                    'GetBalance': GncNumeric, 
+                    'GetClearedBalance': GncNumeric, 
+                    'GetReconciledBalance': GncNumeric, 
+                    'VoidFormerAmount': GncNumeric, 
+                    'VoidFormerValue': GncNumeric 
+                }
+methods_return_instance(Split, split_dict)
+
 Split.account = property( Split.GetAccount, Split.SetAccount )
 Split.parent = property( Split.GetParent, Split.SetParent )
 
 # Account
 Account.add_methods_with_prefix('xaccAccount')
 Account.add_methods_with_prefix('gnc_account_')
-#Functions that return Book
-Account.get_book = method_function_returns_instance(
-    Account.get_book, Book )
-#Functions that return Account
-Account.Lookup = method_function_returns_instance(
-    Account.Lookup, Account )
-Account.get_parent = method_function_returns_instance(
-    Account.get_parent, Account )
-Account.get_root = method_function_returns_instance(
-    Account.get_root, Account )
-Account.nth_child = method_function_returns_instance(
-    Account.nth_child, Account )
-Account.lookup_by_name = method_function_returns_instance(
-    Account.lookup_by_name, Account )
-Account.lookup_by_full_name = method_function_returns_instance(
-    Account.lookup_by_full_name, Account )
-#Functions that return Transaction
-Account.FindTransByDesc = method_function_returns_instance(
-    Account.FindTransByDesc, Transaction )
-#Functions that return Split
-Account.FindSplitByDesc = method_function_returns_instance(
-    Account.FindSplitByDesc, Split )
-#Functions that return GncNumeric
-Account.get_start_balance = method_function_returns_instance(
-    Account.get_start_balance, GncNumeric )
-Account.get_start_cleared_balance = method_function_returns_instance(
-    Account.get_start_cleared_balance, GncNumeric )
-Account.GetBalance = method_function_returns_instance(
-    Account.GetBalance, GncNumeric )
-Account.GetClearedBalance = method_function_returns_instance(
-    Account.GetClearedBalance, GncNumeric )
-Account.GetReconciledBalance = method_function_returns_instance(
-    Account.GetReconciledBalance, GncNumeric )
-Account.GetPresentBalance = method_function_returns_instance(
-    Account.GetPresentBalance, GncNumeric )
-Account.GetProjectedMinimumBalance = method_function_returns_instance(
-    Account.GetProjectedMinimumBalance, GncNumeric )
-Account.GetBalanceAsOfDate = method_function_returns_instance(
-    Account.GetBalanceAsOfDate, GncNumeric )
-Account.ConvertBalanceToCurrency = method_function_returns_instance(
-    Account.ConvertBalanceToCurrency, GncNumeric )
-Account.ConvertBalanceToCurrencyAsOfDate = method_function_returns_instance(
-    Account.ConvertBalanceToCurrencyAsOfDate, GncNumeric )
-Account.GetBalanceInCurrency = method_function_returns_instance(
-    Account.GetBalanceInCurrency, GncNumeric )
-Account.GetClearedBalanceInCurrency = method_function_returns_instance(
-    Account.GetClearedBalanceInCurrency, GncNumeric )
-Account.GetReconciledBalanceInCurrency = method_function_returns_instance(
-    Account.GetReconciledBalanceInCurrency, GncNumeric )
-Account.GetPresentBalanceInCurrency = method_function_returns_instance(
-    Account.GetPresentBalanceInCurrency, GncNumeric )
-Account.GetProjectedMinimumBalanceInCurrency = method_function_returns_instance(
-    Account.GetProjectedMinimumBalanceInCurrency, GncNumeric )
-Account.GetBalanceAsOfDateInCurrency = method_function_returns_instance(
-    Account.GetBalanceInCurrency, GncNumeric )
-Account.GetBalanceChangeForPeriod = method_function_returns_instance(
-    Account.GetBalanceChangeForPeriod, GncNumeric )
-#Functions that return GncCommodity
-Account.GetCommodity = method_function_returns_instance(
-    Account.GetCommodity, GncCommodity )
 
+account_dict =  {   
+                    'get_book' : Book, 
+                    'Lookup' : Account, 
+                    'get_parent' : Account, 
+                    'get_root' : Account, 
+                    'nth_child' : Account, 
+                    'lookup_by_name' : Account, 
+                    'lookup_by_full_name' : Account, 
+                    'GetNthChild' : Account, 
+                    'FindTransByDesc' : Transaction, 
+                    'FindSplitByDesc' : Split, 
+                    'get_start_balance' : GncNumeric, 
+                    'get_start_cleared_balance' : GncNumeric, 
+                    'GetBalance' : GncNumeric, 
+                    'GetClearedBalance' : GncNumeric, 
+                    'GetReconciledBalance' : GncNumeric, 
+                    'GetPresentBalance' : GncNumeric, 
+                    'GetProjectedMinimumBalance' : GncNumeric, 
+                    'GetBalanceAsOfDate' : GncNumeric, 
+                    'ConvertBalanceToCurrency' : GncNumeric, 
+                    'ConvertBalanceToCurrencyAsOfDate' : GncNumeric, 
+                    'GetBalanceInCurrency' : GncNumeric, 
+                    'GetClearedBalanceInCurrency' : GncNumeric, 
+                    'GetReconciledBalanceInCurrency' : GncNumeric, 
+                    'GetPresentBalanceInCurrency' : GncNumeric, 
+                    'GetProjectedMinimumBalanceInCurrency' : GncNumeric, 
+                    'GetBalanceAsOfDateInCurrency' : GncNumeric, 
+                    'GetBalanceChangeForPeriod' : GncNumeric, 
+                    'GetCommodity' : GncCommodity 
+                }
+methods_return_instance(Account, account_dict)
+
 Account.name = property( Account.GetName, Account.SetName )
+
+#GUID
+GUID.add_methods_with_prefix('guid_')
+

Added: gnucash/trunk/src/optional/python-bindings/tests/Makefile.am
===================================================================
--- gnucash/trunk/src/optional/python-bindings/tests/Makefile.am	                        (rev 0)
+++ gnucash/trunk/src/optional/python-bindings/tests/Makefile.am	2008-07-07 21:11:02 UTC (rev 17284)
@@ -0,0 +1,5 @@
+TESTS_ENVIRONMENT = $(top_srcdir)/src/bin/gnucash-env $(PYTHON)
+TESTS = runTests.py
+
+clean-local:
+	rm -f translog.*

Added: gnucash/trunk/src/optional/python-bindings/tests/runTests.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/tests/runTests.py	                        (rev 0)
+++ gnucash/trunk/src/optional/python-bindings/tests/runTests.py	2008-07-07 21:11:02 UTC (rev 17284)
@@ -0,0 +1,14 @@
+import unittest
+
+from test import test_support
+
+from test_book import TestBook
+from test_account import TestAccount
+from test_split import TestSplit
+from test_transaction import TestTransaction
+
+def test_main():
+    test_support.run_unittest(TestBook, TestAccount, TestSplit, TestTransaction)
+
+if __name__ == '__main__':
+    test_main()

Added: gnucash/trunk/src/optional/python-bindings/tests/test_account.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/tests/test_account.py	                        (rev 0)
+++ gnucash/trunk/src/optional/python-bindings/tests/test_account.py	2008-07-07 21:11:02 UTC (rev 17284)
@@ -0,0 +1,26 @@
+from unittest import main
+
+from gnucash import Book, Account, Split
+
+from test_book import BookSession
+
+class AccountSession( BookSession ):
+    def setUp(self):
+        BookSession.setUp(self)
+        self.account = Account(self.book)
+
+class TestAccount( AccountSession ):
+    def test_name(self):
+        NAME = "Money"
+        self.assertEquals( '', self.account.GetName() )
+        self.account.SetName(NAME)
+        self.assertEquals( NAME, self.account.GetName() )
+
+    def test_split(self):
+        SPLIT = Split(self.book)
+        self.assertTrue(self.account.insert_split(SPLIT))
+        self.assertTrue(self.account.find_split(SPLIT))
+        self.assertTrue(self.account.remove_split(SPLIT))
+
+if __name__ == '__main__':
+    main()

Added: gnucash/trunk/src/optional/python-bindings/tests/test_book.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/tests/test_book.py	                        (rev 0)
+++ gnucash/trunk/src/optional/python-bindings/tests/test_book.py	2008-07-07 21:11:02 UTC (rev 17284)
@@ -0,0 +1,14 @@
+from unittest import TestCase, main
+
+from gnucash import Book
+
+class BookSession( TestCase ):
+    def setUp(self):
+        self.book = Book()
+
+class TestBook( BookSession ):
+    def test_markclosed(self):
+        self.book.mark_closed()
+
+if __name__ == '__main__':
+    main()

Added: gnucash/trunk/src/optional/python-bindings/tests/test_split.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/tests/test_split.py	                        (rev 0)
+++ gnucash/trunk/src/optional/python-bindings/tests/test_split.py	2008-07-07 21:11:02 UTC (rev 17284)
@@ -0,0 +1,35 @@
+from unittest import main
+
+from gnucash import Book, Account, Split, Transaction
+
+from test_book import BookSession
+
+class SplitSession( BookSession ):
+    def setUp(self):
+        BookSession.setUp(self)
+        self.split = Split(self.book)
+
+class TestSplit( SplitSession ):
+    def test_memo(self):
+        MEMO = "cookie monster"
+        self.assertEquals( '', self.split.GetMemo() )
+        self.split.SetMemo(MEMO)
+        self.assertEquals( MEMO, self.split.GetMemo() )
+
+    def test_account(self):
+        ACCT = Account(self.book)
+        self.split.SetAccount(ACCT)
+        self.assertTrue( ACCT.Equal(self.split.GetAccount(), True) )
+
+    def test_transaction(self):
+        TRANS = Transaction(self.book)
+        self.split.SetParent(TRANS)
+        TRANS.SetDescription("Foo")
+        self.assertEquals( TRANS.GetDescription(), self.split.GetParent().GetDescription() )
+
+    def test_equal(self):
+        COPY = self.split
+        self.assertTrue( self.split.Equal(COPY, True, False, False) )
+
+if __name__ == '__main__':
+    main()

Added: gnucash/trunk/src/optional/python-bindings/tests/test_transaction.py
===================================================================
--- gnucash/trunk/src/optional/python-bindings/tests/test_transaction.py	                        (rev 0)
+++ gnucash/trunk/src/optional/python-bindings/tests/test_transaction.py	2008-07-07 21:11:02 UTC (rev 17284)
@@ -0,0 +1,97 @@
+from unittest import main
+
+from gnucash import Transaction, Book, Account, Split
+
+from test_book import BookSession
+
+class TransactionSession( BookSession ):
+    def setUp(self):
+        BookSession.setUp(self)
+        self.trans = Transaction(self.book)
+        #Evil bug means we must set a split for the transaction before making
+        #any other changes (is slightly useful for later tests)
+        self.split = Split(self.book)
+        self.split.SetParent(self.trans)
+        ############
+
+class TestTransaction( TransactionSession ):
+    def test_equal(self):
+        TRANS = self.trans
+        self.assertTrue( TRANS.Equal(self.trans, True, False, False, False) )
+
+    def test_clone(self):
+        TRANS = self.trans.Clone()
+        #Clone and original should have different GUIDs
+        self.assertFalse( TRANS.Equal(self.trans, True, False, False, False) )
+        #Clone and original should have the same balance
+        self.assertTrue( TRANS.Equal(self.trans, False, False, True, False) )
+
+    def test_edit(self):
+        self.assertFalse( self.trans.IsOpen() )
+        self.trans.BeginEdit()
+        self.assertTrue( self.trans.IsOpen() )
+        self.trans.CommitEdit()
+        self.assertFalse( self.trans.IsOpen() )
+
+    def test_rollback(self):
+        self.assertEquals( '', self.trans.GetDescription() )
+        self.trans.BeginEdit()
+        DESC = 'Food'
+        self.trans.SetDescription(DESC)
+        self.assertEquals( DESC, self.trans.GetDescription() )
+        self.trans.RollbackEdit() 
+        self.assertEquals( '', self.trans.GetDescription() )
+
+    def test_findsplit(self):
+        ACCT = Account(self.book)
+        self.split.SetAccount( ACCT )
+        SPLIT = self.trans.FindSplitByAccount( ACCT )
+        self.assertTrue( SPLIT.Equal(self.split, True, False, False) )
+    
+    def test_getsplit(self):
+        SPLIT = self.trans.GetSplit(0)
+        self.assertTrue( SPLIT.Equal(self.split, True, False, False) )
+        
+    def test_getsplitindex(self):
+        self.assertEquals( 0, self.trans.GetSplitIndex(self.split) )
+
+    def test_countsplits(self):
+        self.assertEquals( 1, self.trans.CountSplits() )
+
+    def test_readonly(self):
+        self.assertEquals( None, self.trans.GetReadOnly() )
+        REASON = 'none'
+        self.trans.SetReadOnly(REASON)
+        self.assertEquals( REASON, self.trans.GetReadOnly() )
+        self.trans.ClearReadOnly()
+        self.assertEquals( None, self.trans.GetReadOnly() )
+
+    def test_txntype(self):
+        self.assertEquals( '\x00', self.trans.GetTxnType() )
+        TYPE = 'I'
+        self.trans.SetTxnType(TYPE)
+        self.assertEquals( TYPE, self.trans.GetTxnType() )
+        TYPE = 'P'
+        self.trans.SetTxnType(TYPE)
+        self.assertEquals( TYPE, self.trans.GetTxnType() )
+
+    def test_num(self):
+        NUM = '5'
+        self.assertEquals( '', self.trans.GetNum() )
+        self.trans.SetNum(NUM)
+        self.assertEquals( NUM, self.trans.GetNum() )
+
+    def test_description(self):
+        DESCR = 'Groceries'
+        self.assertEquals( '', self.trans.GetDescription() )
+        self.trans.SetDescription(DESCR)
+        self.assertEquals( DESCR, self.trans.GetDescription() )
+
+    def test_notes(self):
+        NOTE = 'For dinner party'
+        self.assertEquals( None, self.trans.GetNotes() )
+        self.trans.SetNotes(NOTE)
+        self.assertEquals( NOTE, self.trans.GetNotes() )
+
+if __name__ == '__main__':
+    main()



More information about the gnucash-changes mailing list