tags 884343 patch
thank you

Hi,

attached is a patch against the package version 2.7.6-1 which switches
gnucash over to python 3.

Cheers,
Julian

-- 
 ()  ascii ribbon campaign - against html e-mail 
 /\                        - against proprietary attachments
>From 9c192bb9c2ae1ab161d8bef4e9efb4e8a3b05fdc Mon Sep 17 00:00:00 2001
From: Julian Wollrath <jwollr...@web.de>
Date: Wed, 14 Mar 2018 10:39:58 +0100
Subject: [PATCH] Switch to python3 (Closes: #884343)

---
 debian/control                                     |   8 +-
 debian/patches/fix_building_with_python3.diff      | 707 +++++++++++++++++++++
 debian/patches/series                              |   1 +
 ...n-gnucash.examples => python3-gnucash.examples} |   0
 ...hon-gnucash.install => python3-gnucash.install} |   0
 ...gnucash.pyinstall => python3-gnucash.pyinstall} |   0
 debian/rules                                       |   4 +-
 8 files changed, 721 insertions(+), 6 deletions(-)
 create mode 100644 debian/patches/fix_building_with_python3.diff
 rename debian/{python-gnucash.examples => python3-gnucash.examples} (100%)
 rename debian/{python-gnucash.install => python3-gnucash.install} (100%)
 rename debian/{python-gnucash.pyinstall => python3-gnucash.pyinstall} (100%)

diff --git a/debian/control b/debian/control
index a64f0413..663574f9 100644
--- a/debian/control
+++ b/debian/control
@@ -25,8 +25,8 @@ Build-Depends: debhelper (>= 11~), pkg-config, dh-python
     ,libwebkit2gtk-4.0-dev
     ,libxml2-dev
     ,libxslt1-dev
-    ,python
-    ,python-dev
+    ,python3
+    ,python3-dev
     ,texinfo
     ,xsltproc
     ,zlib1g-dev
@@ -83,10 +83,10 @@ Description: common files for the financial-accounting software Gnucash
  not be installed directly, but is pulled in automatically by the dependencies
  of the Gnucash package.
 
-Package: python-gnucash
+Package: python3-gnucash
 Section: python
 Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, python-gtk2
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${python3:Depends}
 Description: Gnucash interface for Python
  Gnucash provides accounting functions suitable for use by small businesses and
  individuals. It can track finances in multiple accounts, keeping running and
diff --git a/debian/patches/fix_building_with_python3.diff b/debian/patches/fix_building_with_python3.diff
new file mode 100644
index 00000000..a5774b0f
--- /dev/null
+++ b/debian/patches/fix_building_with_python3.diff
@@ -0,0 +1,707 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 370a6d15f..c85bcf23c 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -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
+diff --git a/bindings/python/__init__.py b/bindings/python/__init__.py
+index 3627eac47..1c874734e 100644
+--- a/bindings/python/__init__.py
++++ b/bindings/python/__init__.py
+@@ -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 <m...@parit.ca>
+diff --git a/bindings/python/function_class.py b/bindings/python/function_class.py
+index f628667a4..db159ff83 100644
+--- a/bindings/python/function_class.py
++++ b/bindings/python/function_class.py
+@@ -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 <pariti...@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))
+ 
+diff --git a/bindings/python/gnucash_business.py b/bindings/python/gnucash_business.py
+index 8d3850f07..f2e47e677 100644
+--- a/bindings/python/gnucash_business.py
++++ b/bindings/python/gnucash_business.py
+@@ -26,18 +26,18 @@
+ #   @author Jeff Green,   ParIT Worker Co-operative <j...@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' )
+diff --git a/bindings/python/gnucash_core.py b/bindings/python/gnucash_core.py
+index fe86958ae..cce02035b 100644
+--- a/bindings/python/gnucash_core.py
++++ b/bindings/python/gnucash_core.py
+@@ -28,15 +28,15 @@
+ #  @author Jeff Green,   ParIT Worker Co-operative <j...@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):
+diff --git a/bindings/python/tests/runTests.py.in b/bindings/python/tests/runTests.py.in
+index 6028c8185..38c0d8d1c 100755
+--- a/bindings/python/tests/runTests.py.in
++++ b/bindings/python/tests/runTests.py.in
+@@ -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()
+diff --git a/bindings/python/tests/test_account.py b/bindings/python/tests/test_account.py
+index 9478f3750..2ee636a7a 100644
+--- a/bindings/python/tests/test_account.py
++++ b/bindings/python/tests/test_account.py
+@@ -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)
+diff --git a/bindings/python/tests/test_numeric.py b/bindings/python/tests/test_numeric.py
+index 86217c66d..4ca39f7c7 100644
+--- a/bindings/python/tests/test_numeric.py
++++ b/bindings/python/tests/test_numeric.py
+@@ -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)
+ 
+diff --git a/bindings/python/tests/test_split.py b/bindings/python/tests/test_split.py
+index ccc67de50..f3da096a2 100644
+--- a/bindings/python/tests/test_split.py
++++ b/bindings/python/tests/test_split.py
+@@ -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)
+diff --git a/bindings/python/tests/test_transaction.py b/bindings/python/tests/test_transaction.py
+index 66994104f..86776db64 100644
+--- a/bindings/python/tests/test_transaction.py
++++ b/bindings/python/tests/test_transaction.py
+@@ -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()
+diff --git a/gnucash/python/gncmod-python.c b/gnucash/python/gncmod-python.c
+index 24d4dc58f..19350d467 100644
+--- a/gnucash/python/gncmod-python.c
++++ b/gnucash/python/gncmod-python.c
+@@ -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
diff --git a/debian/patches/series b/debian/patches/series
index e69de29b..046a2063 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -0,0 +1 @@
+fix_building_with_python3.diff
diff --git a/debian/python-gnucash.examples b/debian/python3-gnucash.examples
similarity index 100%
rename from debian/python-gnucash.examples
rename to debian/python3-gnucash.examples
diff --git a/debian/python-gnucash.install b/debian/python3-gnucash.install
similarity index 100%
rename from debian/python-gnucash.install
rename to debian/python3-gnucash.install
diff --git a/debian/python-gnucash.pyinstall b/debian/python3-gnucash.pyinstall
similarity index 100%
rename from debian/python-gnucash.pyinstall
rename to debian/python3-gnucash.pyinstall
diff --git a/debian/rules b/debian/rules
index 68df300e..02128931 100755
--- a/debian/rules
+++ b/debian/rules
@@ -88,8 +88,8 @@ endif
 override_dh_strip:
 	dh_strip --dbgsym-migration='gnucash-dbg (<< 1:2.6.13~)'
 
-override_dh_python2:
-	dh_python2 --no-guessing-versions -V $(shell pyversions -dv)
+override_dh_python3:
+	dh_python3 -V $(shell pyversions -dv)
 
 override_dh_gencontrol:
 	dh_gencontrol -- -Vmy:Built-Using="$(foreach pkg,googletest,$(word 2,$(shell dpkg --status $(pkg) | grep ^Package)) (=$(word 2,$(shell dpkg --status $(pkg) | grep Version))),)"
-- 
2.16.2

Reply via email to