Bug 791831 - Add python3 support

This switches swig to use python 3 specific features when generating the
bindings, switches the build over to python 3 and makes the neccesary
python 2 to 3 conversions in the bindings and tests.
This commit is contained in:
Julian Wollrath 2018-03-15 09:35:31 +01:00 committed by John Ralls
parent 85ec07ec30
commit a43b115a45
12 changed files with 103 additions and 114 deletions

View File

@ -459,7 +459,7 @@ ENDIF (WITH_SQL)
# ############################################################
IF (WITH_PYTHON)
FIND_PACKAGE(PythonInterp)
FIND_PACKAGE(PythonInterp 3)
IF (NOT PYTHONINTERP_FOUND)
MESSAGE(SEND_ERROR "Python support enabled, but Python interpreter not found.")
ENDIF()
@ -468,14 +468,14 @@ IF (WITH_PYTHON)
MESSAGE(SEND_ERROR "Found python version ${PYTHON_VERSION_STRING}, but it's too old. Need python >= 2.4.0")
ENDIF()
FIND_PACKAGE(PythonLibs)
FIND_PACKAGE(PythonLibs 3)
IF (NOT PYTHONLIBS_FOUND)
MESSAGE(SEND_ERROR "Python support enabled, but Python libraries not found.")
ENDIF()
# Determine where to install the python libraries.
EXECUTE_PROCESS(
COMMAND ${PYTHON_EXECUTABLE} -c "from distutils import sysconfig; print sysconfig.get_python_lib(prefix='${CMAKE_INSTALL_PREFIX}', plat_specific=True)"
COMMAND ${PYTHON_EXECUTABLE} -c "from distutils import sysconfig; print(sysconfig.get_python_lib(prefix='${CMAKE_INSTALL_PREFIX}', plat_specific=True))"
RESULT_VARIABLE PYTHON_SYSCONFIG_RESULT
OUTPUT_VARIABLE PYTHON_SYSCONFIG_OUTPUT
ERROR_VARIABLE PYTHON_SYSCONFIG_ERROR

View File

@ -3,7 +3,7 @@
# >>> from gnucash import thingy
# instead of
# >>> from gnucash.gnucash_core import thingy
from gnucash_core import *
from gnucash.gnucash_core import *
## @file
# @brief helper file for the importing of gnucash
# @author Mark Jenkins, ParIT Worker Co-operative <mark@parit.ca>

View File

@ -1,5 +1,5 @@
# function_class.py -- Library for making python classes from a set
# of functions.
# of functions.
#
# Copyright (C) 2008 ParIT Worker Co-operative <paritinfo@parit.ca>
# This program is free software; you can redistribute it and/or
@ -53,7 +53,7 @@ class ClassFromFunctions(object):
# already exist with the same __instance value, or equivalent __instance
# values, where this is desirable...
return super(ClassFromFunctions, cls).__new__(cls)
def __init__(self, *args, **kargs):
"""Construct a new instance, using either the function
self._module[self._new_instance] or using existing instance
@ -89,7 +89,7 @@ class ClassFromFunctions(object):
return getattr(self._module, function_name)(
self.instance,
*process_list_convert_to_instance(meth_func_args) )
setattr(cls, method_name, method_function)
setattr(method_function, "__name__", method_name)
return method_function
@ -97,41 +97,41 @@ class ClassFromFunctions(object):
@classmethod
def ya_add_classmethod(cls, function_name, method_name):
"""Add the function, method_name to this class as a classmethod named name
Taken from function_class and slightly modified.
"""
def method_function(self, *meth_func_args):
return getattr(self._module, function_name)(
self,
*process_list_convert_to_instance(meth_func_args) )
setattr(cls, method_name, classmethod(method_function))
setattr(method_function, "__name__", method_name)
return method_function
return method_function
@classmethod
def ya_add_method(cls, function_name, method_name):
"""Add the function, method_name to this class as a method named name
Taken from function_class and slightly modified.
"""
def method_function(self, *meth_func_args):
return getattr(self._module, function_name)(
self,
*process_list_convert_to_instance(meth_func_args) )
setattr(cls, method_name, method_function)
setattr(method_function, "__name__", method_name)
return method_function
@classmethod
def add_methods_with_prefix(cls, prefix):
"""Add a group of functions with the same prefix
"""Add a group of functions with the same prefix
"""
for function_name, function_value, after_prefix in \
extract_attributes_with_prefix(cls._module, prefix):
cls.add_method(function_name, after_prefix)
@classmethod
def add_constructor_and_methods_with_prefix(cls, prefix, constructor):
"""Add a group of functions with the same prefix, and set the
@ -160,7 +160,7 @@ def method_function_returns_instance(method_function, cls):
return None
else:
return cls( **kargs )
return new_function
def method_function_returns_instance_list(method_function, cls):
@ -170,7 +170,7 @@ def method_function_returns_instance_list(method_function, cls):
return new_function
def methods_return_instance_lists(cls, function_dict):
for func_name, instance_name in function_dict.iteritems():
for func_name, instance_name in iter(function_dict.items()):
setattr(cls, func_name,
method_function_returns_instance_list(
getattr(cls, func_name), instance_name))
@ -186,7 +186,7 @@ def default_arguments_decorator(function, *args):
new_argset.extend( args[ len(function_args): ] )
return function( *new_argset )
return new_function
def return_instance_if_value_has_it(value):
"""Return value.instance if value is an instance of ClassFromFunctions,
else return value
@ -212,16 +212,16 @@ def extract_attributes_with_prefix(obj, prefix):
the attribute name, the attribute value, and the text that appears
after the prefix in the name
"""
for attr_name, attr_value in obj.__dict__.iteritems():
for attr_name, attr_value in iter(obj.__dict__.items()):
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
and sets the function to return the associated instance
"""
for func_name, instance_name in function_dict.iteritems():
setattr(cls, func_name,
for func_name, instance_name in iter(function_dict.items()):
setattr(cls, func_name,
method_function_returns_instance( getattr(cls, func_name), instance_name))

View File

@ -26,18 +26,18 @@
# @author Jeff Green, ParIT Worker Co-operative <jeff@parit.ca>
# @ingroup python_bindings
import gnucash_core_c
import gnucash.gnucash_core_c as gnucash_core_c
from function_class import \
from gnucash.function_class import \
ClassFromFunctions, extract_attributes_with_prefix, \
default_arguments_decorator, method_function_returns_instance, \
methods_return_instance, methods_return_instance_lists
from gnucash_core import \
from gnucash.gnucash_core import \
GnuCashCoreClass, GncNumeric, GncCommodity, Transaction, \
Split, Book, GncLot, Account, GUID
from gnucash_core_c import GNC_OWNER_CUSTOMER, GNC_OWNER_JOB, \
from gnucash.gnucash_core_c import GNC_OWNER_CUSTOMER, GNC_OWNER_JOB, \
GNC_OWNER_EMPLOYEE, GNC_OWNER_VENDOR, \
GNC_PAYMENT_CASH, GNC_PAYMENT_CARD, \
GNC_DISC_PRETAX, GNC_DISC_SAMETIME, GNC_DISC_POSTTAX, \
@ -66,7 +66,7 @@ class GnuCashBusinessEntity(GnuCashCoreClass):
GnuCashCoreClass.__init__(self, instance=instance)
class Customer(GnuCashBusinessEntity): pass
class Employee(GnuCashBusinessEntity): pass
class Vendor(GnuCashBusinessEntity): pass
@ -88,10 +88,10 @@ class Job(GnuCashBusinessEntity):
if name != None:
self.SetName(name)
else:
GnuCashCoreClass.__init__(self, instance=instance)
GnuCashCoreClass.__init__(self, instance=instance)
class Address(GnuCashCoreClass): pass
class BillTerm(GnuCashCoreClass): pass
class TaxTable(GnuCashCoreClass):
@ -111,14 +111,14 @@ class TaxTable(GnuCashCoreClass):
class TaxTableEntry(GnuCashCoreClass):
def __init__(self, account=None, percent=True, amount=None, instance=None):
"""TaxTableEntry constructor
You must provide an account, or be initizing this with an existing
swig proxy object via the instance keyword argument.
You may also optionally set the percent keyword argument to False to get
a fixed value instead of percentage based tax (which is the default, or
when percent=True).
The tax will be zero percent or zero unless you set the amount keyword
argument to a GncNumeric value as well.
"""
@ -138,7 +138,7 @@ class TaxTableEntry(GnuCashCoreClass):
if amount != None:
self.SetAmount(amount)
else:
GnuCashCoreClass.__init__(self, instance=instance)
GnuCashCoreClass.__init__(self, instance=instance)
class Invoice(GnuCashCoreClass):
def __init__(self, book=None, id=None, currency=None, owner=None,
@ -191,7 +191,7 @@ def decorate_to_return_instance_instead_of_owner(dec_function):
class Entry(GnuCashCoreClass):
def __init__(self, book=None, invoice=None, date=None, instance=None):
"""Invoice Entry constructor
You must provide a book or be initizing this with an existing
swig proxy object via the instance keyword argument.
@ -217,7 +217,7 @@ class Entry(GnuCashCoreClass):
if invoice != None:
invoice.AddEntry(self)
else:
GnuCashCoreClass.__init__(self, instance=instance)
GnuCashCoreClass.__init__(self, instance=instance)
def test_type(self, invoice):
if invoice.GetTypeString() == "Invoice" and self.GetInvoice() == None:
@ -370,7 +370,7 @@ entry_dict = {
'GetInvoice': Invoice,
'GetBill': Invoice
}
methods_return_instance(Entry, entry_dict)
methods_return_instance(Entry, entry_dict)
Entry.decorate_functions(
decorate_to_return_instance_instead_of_owner,
'GetBillTo' )

View File

@ -28,15 +28,15 @@
# @author Jeff Green, ParIT Worker Co-operative <jeff@parit.ca>
# @ingroup python_bindings
import gnucash_core_c
import gnucash.gnucash_core_c as gnucash_core_c
from function_class import \
from gnucash.function_class import \
ClassFromFunctions, extract_attributes_with_prefix, \
default_arguments_decorator, method_function_returns_instance, \
methods_return_instance, process_list_convert_to_instance, \
method_function_returns_instance_list, methods_return_instance_lists
from gnucash_core_c import gncInvoiceLookup, gncInvoiceGetInvoiceFromTxn, \
from gnucash.gnucash_core_c import gncInvoiceLookup, gncInvoiceGetInvoiceFromTxn, \
gncInvoiceGetInvoiceFromLot, gncEntryLookup, gncInvoiceLookup, \
gncCustomerLookup, gncVendorLookup, gncJobLookup, gncEmployeeLookup, \
gncTaxTableLookup, gncTaxTableLookupByName, gnc_search_invoice_on_id, \
@ -112,7 +112,7 @@ class Session(GnuCashCoreClass):
# More background: https://bugzilla.gnome.org/show_bug.cgi?id=726891
if book_uri[:3] != "xml" or not is_new:
self.load()
except GnuCashBackendException, backend_exception:
except GnuCashBackendException as backend_exception:
self.end()
self.destroy()
raise
@ -174,75 +174,75 @@ class Book(GnuCashCoreClass):
get_table -- Returns a commodity lookup table, of type GncCommodityTable
"""
def InvoiceLookup(self, guid):
from gnucash_business import Invoice
from gnucash.gnucash_business import Invoice
return self.do_lookup_create_oo_instance(
gncInvoiceLookup, Invoice, guid.get_instance() )
def EntryLookup(self, guid):
from gnucash_business import Entry
from gnucash.gnucash_business import Entry
return self.do_lookup_create_oo_instance(
gncEntryLookup, Entry, guid.get_instance() )
def CustomerLookup(self, guid):
from gnucash_business import Customer
from gnucash.gnucash_business import Customer
return self.do_lookup_create_oo_instance(
gncCustomerLookup, Customer, guid.get_instance())
def JobLookup(self, guid):
from gnucash_business import Job
from gnucash.gnucash_business import Job
return self.do_lookup_create_oo_instance(
gncJobLookup, Job, guid.get_instance() )
def VendorLookup(self, guid):
from gnucash_business import Vendor
from gnucash.gnucash_business import Vendor
return self.do_lookup_create_oo_instance(
gncVendorLookup, Vendor, guid.get_instance() )
def EmployeeLookup(self, guid):
from gnucash_business import Employee
from gnucash.gnucash_business import Employee
return self.do_lookup_create_oo_instance(
gncEmployeeLookup, Employee, guid.get_instance() )
def TaxTableLookup(self, guid):
from gnucash_business import TaxTable
from gnucash.gnucash_business import TaxTable
return self.do_lookup_create_oo_instance(
gncTaxTableLookup, TaxTable, guid.get_instance() )
def TaxTableLookupByName(self, name):
from gnucash_business import TaxTable
from gnucash.gnucash_business import TaxTable
return self.do_lookup_create_oo_instance(
gncTaxTableLookupByName, TaxTable, name)
def TaxTableGetTables(self):
from gnucash_business import TaxTable
from gnucash.gnucash_business import TaxTable
return [ TaxTable(instance=item) for item in gncTaxTableGetTables(self.instance) ]
def BillLookupByID(self, id):
from gnucash_business import Bill
from gnucash.gnucash_business import Bill
return self.do_lookup_create_oo_instance(
gnc_search_bill_on_id, Bill, id)
def InvoiceLookupByID(self, id):
from gnucash_business import Invoice
from gnucash.gnucash_business import Invoice
return self.do_lookup_create_oo_instance(
gnc_search_invoice_on_id, Invoice, id)
def CustomerLookupByID(self, id):
from gnucash_business import Customer
from gnucash.gnucash_business import Customer
return self.do_lookup_create_oo_instance(
gnc_search_customer_on_id, Customer, id)
def VendorLookupByID(self, id):
from gnucash_business import Vendor
from gnucash.gnucash_business import Vendor
return self.do_lookup_create_oo_instance(
gnc_search_vendor_on_id, Vendor, id)
def InvoiceNextID(self, customer):
''' Return the next invoice ID.
''' Return the next invoice ID.
This works but I'm not entirely happy with it. FIX ME'''
from gnucash.gnucash_core_c import gncInvoiceNextID
return gncInvoiceNextID(self.get_instance(),customer.GetEndOwner().get_instance()[1])
def BillNextID(self, vendor):
''' Return the next Bill ID. '''
from gnucash.gnucash_core_c import gncInvoiceNextID
@ -294,11 +294,11 @@ class GncNumeric(GnuCashCoreClass):
return gnc_numeric_zero()
elif len(args) == 1:
arg = args[0]
if type(arg) in (int, long):
if isinstance(arg, int):
return gnc_numeric_create(arg ,1)
elif type(arg) == float:
elif isinstance(arg, float):
return double_to_gnc_numeric(arg, GNC_DENOM_AUTO, GNC_HOW_DENOM_FIXED | GNC_HOW_RND_NEVER)
elif type(arg) == str:
elif isinstance(arg, str):
instance = gnc_numeric_zero()
if not string_to_gnc_numeric(arg, instance):
raise TypeError('Failed to convert to GncNumeric: ' + str(args))
@ -306,17 +306,17 @@ class GncNumeric(GnuCashCoreClass):
else:
raise TypeError('Only single int/float/str allowed: ' + str(args))
elif len(args) == 2:
if type(args[0]) == int and type(args[1]) == int:
if isinstance(args[0], int) and isinstance(args[1], int):
return gnc_numeric_create(*args)
else:
raise TypeError('Only two ints allowed: ' + str(args))
elif len(args) == 3:
if type(args[0]) == float \
and type(args[1]) in (int, long) \
if isinstance(args[0], float) \
and isinstance(args[1], int) \
and type(args[2]) == type(GNC_HOW_DENOM_FIXED):
return double_to_gnc_numeric(*args)
else:
raise TypeError('Only (float, int/long, GNC_HOW_RND_*) allowed: ' + str(args))
raise TypeError('Only (float, int, GNC_HOW_RND_*) allowed: ' + str(args))
else:
raise TypeError('Required single int/float/str or two ints: ' + str(args))
@ -324,14 +324,10 @@ class GncNumeric(GnuCashCoreClass):
from fractions import Fraction
return Fraction(self.num(), self.denom())
def __unicode__(self):
def __str__(self):
"""Returns a human readable numeric value string as UTF8."""
return gnc_numeric_to_string(self.instance)
def __str__(self):
"""returns a human readable numeric value string as bytes."""
return unicode(self).encode('utf-8')
class GncPrice(GnuCashCoreClass):
'''
Each priceEach price in the database represents an "instantaneous"
@ -411,7 +407,7 @@ class GncCommodityNamespace(GnuCashCoreClass):
class GncLot(GnuCashCoreClass):
def GetInvoiceFromLot(self):
from gnucash_business import Invoice
from gnucash.gnucash_business import Invoice
return self.do_lookup_create_oo_instance(
gncInvoiceGetInvoiceFromLot, Invoice )
@ -434,7 +430,7 @@ class Transaction(GnuCashCoreClass):
return self.GetSplitList().pop(n)
def GetInvoiceFromTxn(self):
from gnucash_business import Transaction
from gnucash.gnucash_business import Transaction
return self.do_lookup_create_oo_instance(
gncInvoiceGetInvoiceFromTxn, Transaction )
@ -587,7 +583,7 @@ methods_return_instance_lists(
GncCommodityTable, { 'get_namespaces_list': GncCommodityNamespace,
'get_commodities': GncCommodity,
'get_quotable_commodities': GncCommodity,
} )
setattr(GncCommodityTable, 'get_namespaces', getattr(GncCommodityTable, '_get_namespaces_py'))
@ -632,7 +628,7 @@ trans_dict = {
'GetCurrency': GncCommodity,
'GetGUID': GUID
}
methods_return_instance(Transaction, trans_dict)
methods_return_instance_lists(
Transaction, { 'GetSplitList': Split,
@ -738,18 +734,18 @@ class GUIDString(GnuCashCoreClass):
GUIDString.add_constructor_and_methods_with_prefix('string_', 'to_guid')
#Query
from gnucash_core_c import \
from gnucash.gnucash_core_c import \
QOF_QUERY_AND, \
QOF_QUERY_OR, \
QOF_QUERY_NAND, \
QOF_QUERY_NOR, \
QOF_QUERY_XOR
from gnucash_core_c import \
from gnucash.gnucash_core_c import \
QOF_STRING_MATCH_NORMAL, \
QOF_STRING_MATCH_CASEINSENSITIVE
from gnucash_core_c import \
from gnucash.gnucash_core_c import \
QOF_COMPARE_LT, \
QOF_COMPARE_LTE, \
QOF_COMPARE_EQUAL, \
@ -757,10 +753,10 @@ from gnucash_core_c import \
QOF_COMPARE_GTE, \
QOF_COMPARE_NEQ
from gnucash_core_c import \
from gnucash.gnucash_core_c import \
INVOICE_TYPE
from gnucash_core_c import \
from gnucash.gnucash_core_c import \
INVOICE_IS_PAID
class Query(GnuCashCoreClass):

View File

@ -5,8 +5,6 @@ import os
os.environ["GNC_UNINSTALLED"] = "1"
from test import test_support
from test_book import TestBook
from test_account import TestAccount
from test_split import TestSplit
@ -15,8 +13,5 @@ from test_business import TestBusiness
from test_commodity import TestCommodity, TestCommodityNamespace
from test_numeric import TestGncNumeric
def test_main():
test_support.run_unittest(TestBook, TestAccount, TestSplit, TestTransaction, TestBusiness, TestCommodity, TestCommodityNamespace, TestGncNumeric)
if __name__ == '__main__':
test_main()
unittest.main()

View File

@ -13,9 +13,9 @@ class AccountSession( BookSession ):
class TestAccount( AccountSession ):
def test_name(self):
NAME = "Money"
self.assertEquals( '', self.account.GetName() )
self.assertEqual( '', self.account.GetName() )
self.account.SetName(NAME)
self.assertEquals( NAME, self.account.GetName() )
self.assertEqual( NAME, self.account.GetName() )
def test_split(self):
SPLIT = Split(self.book)

View File

@ -22,12 +22,6 @@ class TestGncNumeric( TestCase ):
self.assertEqual(num.num(), 3)
self.assertEqual(num.denom(), 1)
def test_from_long(self):
num = GncNumeric(3L)
self.assertEqual(str(num), "3/1")
self.assertEqual(num.num(), 3)
self.assertEqual(num.denom(), 1)
with self.assertRaises(Exception) as context:
GncNumeric((2**64)+1)

View File

@ -17,9 +17,9 @@ class SplitSession( BookSession ):
class TestSplit( SplitSession ):
def test_memo(self):
MEMO = "cookie monster"
self.assertEquals( '', self.split.GetMemo() )
self.assertEqual( '', self.split.GetMemo() )
self.split.SetMemo(MEMO)
self.assertEquals( MEMO, self.split.GetMemo() )
self.assertEqual( MEMO, self.split.GetMemo() )
def test_account(self):
ACCT = Account(self.book)
@ -49,7 +49,7 @@ class TestSplit( SplitSession ):
self.split.SetParent(TRANS)
TRANS.SetCurrency(self.currency)
TRANS.SetDescription("Foo")
self.assertEquals( TRANS.GetDescription(), self.split.GetParent().GetDescription() )
self.assertEqual( TRANS.GetDescription(), self.split.GetParent().GetDescription() )
g_log_remove_handler(domain2, hdlr2)
g_log_remove_handler(domain1, hdlr1)

View File

@ -73,13 +73,13 @@ class TestTransaction( TransactionSession ):
self.assertFalse( self.trans.IsOpen() )
def test_rollback(self):
self.assertEquals( '', self.trans.GetDescription() )
self.assertEqual( '', 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() )
self.assertEqual( DESC, self.trans.GetDescription() )
self.trans.RollbackEdit()
self.assertEqual( '', self.trans.GetDescription() )
def test_findsplit(self):
ACCT = Account(self.book)
@ -87,51 +87,51 @@ class TestTransaction( TransactionSession ):
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) )
self.assertEqual( 0, self.trans.GetSplitIndex(self.split) )
def test_countsplits(self):
self.assertEquals( 1, self.trans.CountSplits() )
self.assertEqual( 1, self.trans.CountSplits() )
def test_readonly(self):
self.assertEquals( None, self.trans.GetReadOnly() )
self.assertEqual( None, self.trans.GetReadOnly() )
REASON = 'none'
self.trans.SetReadOnly(REASON)
self.assertEquals( REASON, self.trans.GetReadOnly() )
self.assertEqual( REASON, self.trans.GetReadOnly() )
self.trans.ClearReadOnly()
self.assertEquals( None, self.trans.GetReadOnly() )
self.assertEqual( None, self.trans.GetReadOnly() )
def test_txntype(self):
self.assertEquals( '\x00', self.trans.GetTxnType() )
self.assertEqual( '\x00', self.trans.GetTxnType() )
TYPE = 'I'
self.trans.SetTxnType(TYPE)
self.assertEquals( TYPE, self.trans.GetTxnType() )
self.assertEqual( TYPE, self.trans.GetTxnType() )
TYPE = 'P'
self.trans.SetTxnType(TYPE)
self.assertEquals( TYPE, self.trans.GetTxnType() )
self.assertEqual( TYPE, self.trans.GetTxnType() )
def test_num(self):
NUM = '5'
self.assertEquals( '', self.trans.GetNum() )
self.assertEqual( '', self.trans.GetNum() )
self.trans.SetNum(NUM)
self.assertEquals( NUM, self.trans.GetNum() )
self.assertEqual( NUM, self.trans.GetNum() )
def test_description(self):
DESCR = 'Groceries'
self.assertEquals( '', self.trans.GetDescription() )
self.assertEqual( '', self.trans.GetDescription() )
self.trans.SetDescription(DESCR)
self.assertEquals( DESCR, self.trans.GetDescription() )
self.assertEqual( DESCR, self.trans.GetDescription() )
def test_notes(self):
NOTE = 'For dinner party'
self.assertEquals( None, self.trans.GetNotes() )
self.assertEqual( None, self.trans.GetNotes() )
self.trans.SetNotes(NOTE)
self.assertEquals( NOTE, self.trans.GetNotes() )
self.assertEqual( NOTE, self.trans.GetNotes() )
if __name__ == '__main__':
main()

View File

@ -75,7 +75,7 @@ macro (gnc_add_swig_python_command _target _out_var _py_out_var _output _py_outp
if (GENERATE_SWIG_WRAPPERS)
set (DEFAULT_SWIG_PYTHON_FLAGS
-python
-python -py3
-Wall -Werror
${SWIG_ARGS}
)

View File

@ -73,7 +73,11 @@ libgncmod_python_gnc_module_init(int refcount)
*/
FILE *fp;
gchar *pkgdatadir, *init_filename;
#if PY_VERSION_HEX >= 0x03000000
wchar_t* argv = NULL;
#else
char* argv = "";
#endif
Py_Initialize();
PySys_SetArgv(0, &argv);
#if PY_VERSION_HEX >= 0x03000000