File presage-0.9.1-python3.patch of Package presage

Index: presage-0.9.1/bindings/python/Makefile.am
===================================================================
--- presage-0.9.1.orig/bindings/python/Makefile.am
+++ presage-0.9.1/bindings/python/Makefile.am
@@ -81,7 +81,7 @@ clean-local:
 	rm -rf build
 
 presage_wrap.cpp presage_wrap.h presage.py:	$(SWIG_INTERFACE) $(PRESAGE_INTERFACE)
-	$(SWIG) -c++ -python -I$(top_srcdir)/src/lib -o presage_wrap.cpp -outdir . $(srcdir)/$(SWIG_INTERFACE)
+	$(SWIG) -c++ -python -py3 -I$(top_srcdir)/src/lib -o presage_wrap.cpp -outdir . $(srcdir)/$(SWIG_INTERFACE)
 
 if HAVE_HELP2MAN
 presage_python_demo.1:	presage_python_demo.in $(top_srcdir)/configure.ac
Index: presage-0.9.1/bindings/python/presage_python_demo.in
===================================================================
--- presage-0.9.1.orig/bindings/python/presage_python_demo.in
+++ presage-0.9.1/bindings/python/presage_python_demo.in
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 ##########
 #  Presage, an extensible predictive text entry system
@@ -25,11 +25,12 @@ import getopt
 
 PROGRAM_NAME = 'presage_python_demo'
 
-config = None
-suggestions = None
+CONFIG = None
+SUGGESTIONS = None
+
 
 def disclaimer():
-	print """
+    print("""
 Presage python demo
 -----------------------
 
@@ -42,19 +43,21 @@ Its intent is NOT to provide a predictiv
 
 Think of Presage as the predictive backend that sits behind a shiny
 user interface and does all the predictive heavy lifting.
-"""
+""")
+
 
 def print_version():
-	print """
+    print("""
 %s (%s) version %s
 Copyright (C) 2004 Matteo Vescovi.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
 to the extent permitted by law.
-""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@')
+""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@'))
+
 
 def print_usage():
-	print """
+    print("""
 Usage: %s [OPTION]...
 
 At the prompt, type in some text. Hit enter to generate a prediction.
@@ -66,40 +69,41 @@ Any text input is valid, including no te
   -v, --version        output version information and exit
 
 Direct your bug reports to: %s
-""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@')
+""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@'))
+
 
 def parse_cmd_line_args():
-	global config
-	global suggestions
+    global CONFIG
+    global SUGGESTIONS
+
+    short_options = "c:s:hv"
+    long_options = ["config=", "suggestions=", "help", "version"]
 
-	short_options = "c:s:hv"
-	long_options  = ["config=", "suggestions=", "help", "version"]
-	
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], short_options, long_options)
-	except getopt.GetoptError, err:
-		print str(err)
-		sys.exit(1)
-
-	for opt, arg in opts:
-		if opt in ('-v', '--version'):
-			print_version()
-			sys.exit()
-		elif opt in ('-h', '--help'):
-			print_usage()
-			sys.exit()
-		elif opt in ('-c', '--config'):
-			config = arg
-		elif opt in ('-s', '--suggestions'):
-			suggestions = arg
+    try:
+        opts, _ = getopt.getopt(sys.argv[1:], short_options, long_options)
+    except getopt.GetoptError as err:
+        print(str(err))
+        sys.exit(1)
+
+    for opt, arg in opts:
+        if opt in ('-v', '--version'):
+            print_version()
+            sys.exit()
+        elif opt in ('-h', '--help'):
+            print_usage()
+            sys.exit()
+        elif opt in ('-c', '--config'):
+            CONFIG = arg
+        elif opt in ('-s', '--suggestions'):
+            SUGGESTIONS = arg
 
 
 def main():
-        try:
-	        import presage
+    try:
+        import presage
 
-        except ImportError, e:
-                print '''
+    except ImportError as err:
+        print('''
 Error: failed to import module presage.
 
 Check that presage python binding is properly installed (if
@@ -109,53 +113,53 @@ accordingly).
 Check that presage library is properly installed (if installed in a
 non-standard location, please set LD_LIBRARY_PATH (PATH, LIBPATH)
 accordingly).
-'''
-		print e
-                sys.exit(1)
-
-	try:
-		# Define and create PresageCallback object
-		class DemoCallback(presage.PresageCallback):
-			def __init__(self):
-				presage.PresageCallback.__init__(self)
-				self.buffer = ''
-
-			def get_past_stream(self):
-				return self.buffer
-			
-			def get_future_stream(self):
-				return ''
-
-		# Presage owns callback, so we create it and disown it
-		callback = DemoCallback().__disown__()
-
-		# Create Presage object
-		if config:
-			prsg = presage.Presage(callback, config)
-		else:
-			prsg = presage.Presage(callback)
-		
-		if suggestions:
-			prsg.config('Presage.Selector.SUGGESTIONS', suggestions)
-
-		print "Enter text at the prompt (press enter on empty line to exit):"
-		str = None
-		while str != "":
-			str = raw_input(">  ")
-			callback.buffer += str
-			print prsg.predict()
-		
-	        # Destroy Presage object
-		del prsg
-
-	except presage.PresageException,ex:
-		print ex.what()
-		sys.exit(1)
+''')
+        print(err)
+        sys.exit(1)
+
+    try:
+        # Define and create PresageCallback object
+        class DemoCallback(presage.PresageCallback):
+            def __init__(self):
+                presage.PresageCallback.__init__(self)
+                self.buffer = ''
+
+            def get_past_stream(self):
+                return self.buffer
+
+            def get_future_stream(self):
+                return ''
+
+        # Presage owns callback, so we create it and disown it
+        callback = DemoCallback().__disown__()
+
+        # Create Presage object
+        if CONFIG:
+            prsg = presage.Presage(callback, CONFIG)
+        else:
+            prsg = presage.Presage(callback)
+
+        if SUGGESTIONS:
+            prsg.config('Presage.Selector.SUGGESTIONS', SUGGESTIONS)
+
+        print("Enter text at the prompt (press enter on empty line to exit):")
+        strs = None
+        while strs != "":
+            strs = input(">  ")
+            callback.buffer += strs
+            print(prsg.predict())
+
+        # Destroy Presage object
+        del prsg
+
+    except presage.PresageException as ex:
+        print(ex.what())
+        sys.exit(1)
 
-	print "Goodbye"
+    print("Goodbye")
 
 
 if __name__ == '__main__':
-	parse_cmd_line_args()
-	disclaimer()
-	main()
+    parse_cmd_line_args()
+    disclaimer()
+    main()
Index: presage-0.9.1/configure.ac
===================================================================
--- presage-0.9.1.orig/configure.ac
+++ presage-0.9.1/configure.ac
@@ -233,7 +233,7 @@ AM_PATH_PYTHON([2.0],
                [AC_MSG_WARN([Python not found. Python is required to build presage python binding. Python can be obtained from http://www.python.org])])
 if test "$PYTHON" != :
 then
-    python_include_path=`$PYTHON -c "import distutils.sysconfig; print distutils.sysconfig.get_python_inc();"`
+    python_include_path=`$PYTHON -c "import sysconfig; print(sysconfig.get_path('include'));"`
     AC_CHECK_HEADERS([${python_include_path}/Python.h],
                      [have_python_header=true],
                      [AC_MSG_WARN([Python.h header file not found. Python development files are required to build presage python binding. Python can be obtained from http://www.python.org])],
@@ -295,7 +295,7 @@ then
     AC_MSG_RESULT($have_pyatspi)
     
     AC_MSG_CHECKING(for python gtk module)
-    $PYTHON -c "import gtk" 2&>/dev/null
+    $PYTHON -c "import gi; gi.require_version('Gtk', '3.0'); from gi.repository import Gtk" 2&>/dev/null
     if test $? -eq 0;
     then
     	have_python_gtk=yes
@@ -305,7 +305,7 @@ then
     AC_MSG_RESULT($have_python_gtk)
     
     AC_MSG_CHECKING(for python pango module)
-    $PYTHON -c "import pango" 2&>/dev/null
+    $PYTHON -c "import gi; from gi.repository import Pango" 2&>/dev/null
     if test $? -eq 0;
     then
     	have_python_pango=yes
Index: presage-0.9.1/apps/python/pyprompter.in
===================================================================
--- presage-0.9.1.orig/apps/python/pyprompter.in
+++ presage-0.9.1/apps/python/pyprompter.in
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 ##########
 #  Presage, an extensible predictive text entry system
@@ -25,20 +25,22 @@ import getopt
 import os
 
 PROGRAM_NAME = 'pyprompter'
-config = None
-suggestions = None
+CONFIG = None
+SUGGESTIONS = None
+
 
 def print_version():
-   print """
+    print("""
 %s (%s) version %s
 Copyright (C) 2004 Matteo Vescovi.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
 to the extent permitted by law.
-""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@')
+""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@'))
+
 
 def print_usage():
-   print """
+    print("""
 Usage: %s [options]
 
 Options:
@@ -55,60 +57,62 @@ clicking on it or by highlighting it wit
 pressing ENTER; the desired text will be automatically entered.
 
 Direct your bug reports to: %s
-""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@')
+""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@'))
+
 
 def parse_cmd_line_args():
-   short_options = "c:s:hv"
-   long_options  = ["config=", "suggestions=", "help", "version"]
-   
-   try:
-      opts, args = getopt.getopt(sys.argv[1:], short_options, long_options)
-   except getopt.GetoptError, err:
-      print str(err)
-      sys.exit(1)
-   
-   for opt, arg in opts:
-      if opt in ('-v', '--version'):
-         print_version()
-         sys.exit()
-      elif opt in ('-h', '--help'):
-         print_usage()
-         sys.exit()
-      elif opt in ('-c', '--config'):
-         global config
-         config = arg
-      elif opt in ('-s', '--suggestions'):
-         global suggestions
-         suggestions = arg
+    short_options = "c:s:hv"
+    long_options = ["config=", "suggestions=", "help", "version"]
+
+    try:
+        opts, _ = getopt.getopt(sys.argv[1:], short_options, long_options)
+    except getopt.GetoptError as err:
+        print(str(err))
+        sys.exit(1)
+
+    for opt, arg in opts:
+        if opt in ('-v', '--version'):
+            print_version()
+            sys.exit()
+        elif opt in ('-h', '--help'):
+            print_usage()
+            sys.exit()
+        elif opt in ('-c', '--config'):
+            global CONFIG
+            CONFIG = arg
+        elif opt in ('-s', '--suggestions'):
+            global SUGGESTIONS
+            SUGGESTIONS = arg
 
 
 if __name__ == "__main__":
-   parse_cmd_line_args()
+    parse_cmd_line_args()
 
-   try:
-      import prompter.prompter
-   except ImportError, e:
-      print '''
+    try:
+        import prompter.prompter
+    except ImportError as err:
+        print('''
 Error: failed to import module prompter.
 
 Check that prompter is properly installed (if installed in a
 non-standard location, please set PYTHONPATH accordingly).
-'''
-      print e
-   else:
-      if not config:
-         # try to locate presage.xml config file
-         scriptdir = os.path.dirname(sys.argv[0])
-         # in scriptdir/etc
-         conffile = os.path.join(scriptdir, 'etc', 'presage.xml')
-         if os.path.isfile(conffile):
-            config = conffile
-         else:
-            # in scriptdir/../etc
-            conffile = os.path.join(scriptdir, '..', 'etc', 'presage.xml')
-            if os.path.isfile(conffile):
-               config = conffile
-         print 'Configuration file: ' + str(config)
-
-      app = prompter.prompter.Prompter("@PACKAGE_VERSION@", config, suggestions)
-      app.MainLoop()
+''')
+        print(err)
+    else:
+        if not CONFIG:
+            # try to locate presage.xml config file
+            SCRIPTDIR = os.path.dirname(sys.argv[0])
+            # in scriptdir/etc
+            CONFFILE = os.path.join(SCRIPTDIR, 'etc', 'presage.xml')
+            if os.path.isfile(CONFFILE):
+                CONFIG = CONFFILE
+            else:
+                # in scriptdir/../etc
+                CONFFILE = os.path.join(SCRIPTDIR, '..', 'etc', 'presage.xml')
+                if os.path.isfile(CONFFILE):
+                    CONFIG = CONFFILE
+            print('Configuration file: ' + str(CONFIG))
+
+        APP = prompter.prompter.Prompter(
+            "@PACKAGE_VERSION@", CONFIG, SUGGESTIONS)
+        APP.MainLoop()
Index: presage-0.9.1/apps/python/prompter/prompter.py
===================================================================
--- presage-0.9.1.orig/apps/python/prompter/prompter.py
+++ presage-0.9.1/apps/python/prompter/prompter.py
@@ -23,21 +23,22 @@ import sys
 try:
    import wx
    import wx.stc
-except ImportError, ex:
-   print '''
+   import wx.adv
+except ImportError as ex:
+   print('''
 Error: failed to import module wxPython.
 
 wxPython is a Python binding for the wxWidgets toolkit.
 
 Check that wxPython is properly installed.
-'''
-   print ex
+''')
+   print(ex)
    sys.exit(1)
 
 try:
    import presage
-except ImportError, ex:
-   print '''
+except ImportError as ex:
+   print('''
 Error: failed to import module presage.
 
 Check that presage python binding is properly installed (if
@@ -47,8 +48,8 @@ accordingly).
 Check that presage library is properly installed (if installed in a
 non-standard location, please set LD_LIBRARY_PATH (PATH, LIBPATH)
 accordingly).
-'''
-   print ex
+''')
+   print(ex)
    sys.exit(1)
 
 ##########
@@ -238,7 +239,7 @@ class PrompterFrame(wx.Frame):
       self.fileMenu.Enable(wx.ID_SAVEAS, False)
 
    def OnFileMenuOpen(self, event):
-      print "Opening a file.."
+      print("Opening a file..")
 
       # Create the dialog. In this case the current directory is forced as the starting
       # directory for the dialog, and no default file name is forced. This can easilly
@@ -249,7 +250,7 @@ class PrompterFrame(wx.Frame):
       # dialog is set up to change the current working directory to the path chosen.
       dlg = wx.FileDialog(
           self, message="Choose a file", defaultDir="", 
-          defaultFile="", wildcard=self.wildcard, style=wx.OPEN | wx.CHANGE_DIR
+          defaultFile="", wildcard=self.wildcard, style=wx.FD_OPEN | wx.FD_CHANGE_DIR
           )
       
       # Show the dialog and retrieve the user response. If it is the OK response, 
@@ -279,7 +280,7 @@ class PrompterFrame(wx.Frame):
       dlg.Destroy()
 
    def OnFileMenuSave(self, event):
-      print "Save file"
+      print("Save file")
       if self.editor.file == None:
          self.OnFileMenuSaveAs(event)
       else:
@@ -287,7 +288,7 @@ class PrompterFrame(wx.Frame):
          self.fileMenu.Enable(wx.ID_SAVE, False)
 
    def OnFileMenuSaveAs(self, event):
-      print "Save file as"
+      print("Save file as")
 
       # Create the dialog. In this case the current directory is forced as the starting
       # directory for the dialog, and no default file name is forced. This can easilly
@@ -298,12 +299,12 @@ class PrompterFrame(wx.Frame):
       # directory than the one initially set.
       dlg = wx.FileDialog(
           self, message="Save file as ...", defaultDir="", 
-          defaultFile="", wildcard=self.wildcard, style=wx.SAVE
+          defaultFile="", wildcard=self.wildcard, style=wx.FD_SAVE
           )
 
       # This sets the default filter that the user will initially see. Otherwise,
       # the first filter in the list will be used by default.
-      dlg.SetFilterIndex(2)
+      dlg.SetFilterIndex(1)
 
       # Show the dialog and retrieve the user response. If it is the OK response, 
       # process the data.
@@ -321,31 +322,31 @@ class PrompterFrame(wx.Frame):
       self.OnFileMenuNew(event)        # this will do for now
    
    def OnFileMenuQuit(self, event):
-      print "This should first check that changes have been saved..."
+      print("This should first check that changes have been saved...")
       self.Close(True)
    
    def OnEditMenuUndo(self, event):
       if self.editor.CanUndo():
          self.editor.Undo()
-         print "Undo last action"
+         print("Undo last action")
 
    def OnEditMenuRedo(self, event):
       if self.editor.CanRedo():
          self.editor.Redo()
-         print "Redo last action"
+         print("Redo last action")
 
    def OnEditMenuCut(self, event):
       self.clip = self.editor.GetSelectedText()
       self.editor.ReplaceSelection('')
-      print "Cut selected text: " + self.clip
+      print("Cut selected text: " + self.clip)
    
    def OnEditMenuCopy(self, event):
       self.clip = self.editor.GetSelectedText()
-      print "Stored selected text into clip: " + self.clip
+      print("Stored selected text into clip: " + self.clip)
    
    def OnEditMenuPaste(self, event):
       self.editor.ReplaceSelection(self.clip)
-      print "Replace selection with: " + self.clip
+      print("Replace selection with: " + self.clip)
 
    def OnEditMenuSelectAll(self, event):
       self.editor.SelectAll()
@@ -360,7 +361,7 @@ class PrompterFrame(wx.Frame):
       self.editor.DecreaseTextSize()
 
    def OnViewMenuShowToolbar(self, event):
-      if event.Checked():
+      if event.IsChecked():
          self.toolbar.Show()
       else:
          self.toolbar.Hide()
@@ -370,10 +371,10 @@ class PrompterFrame(wx.Frame):
       self.editor.ShowPrediction()
 
    def OnPresageMenuToggleFunctionMode(self, event):
-      self.editor.function_keys_enabled = event.Checked()
+      self.editor.function_keys_enabled = event.IsChecked()
 
    def OnPresageMenuToggleAutopunctuationMode(self, event):
-      self.editor.autopunctuation = event.Checked()
+      self.editor.autopunctuation = event.IsChecked()
 
    def OnHelpMenuContents(self, event):
       message = "Sorry, help not written yet."
@@ -412,7 +413,7 @@ with this program; if not, write to the
       # AboutBox and AboutDialogInfo were introduced in wxPython 2.7.1.1
       if wx.VERSION > (2, 7, 1, 1):
          # build about dialog information
-         info = wx.AboutDialogInfo()
+         info = wx.adv.AboutDialogInfo()
          info.SetName(name)
          info.SetVersion(version)
          info.SetCopyright(copyright)
@@ -426,7 +427,7 @@ with this program; if not, write to the
          #info.SetIcon()
          
          # show about dialog box
-         wx.AboutBox(info)
+         wx.adv.AboutBox(info)
 
       else:
          message = name + ' ' + version + '\n' \
@@ -517,7 +518,7 @@ class PrompterEditor(wx.stc.StyledTextCt
       wx.CallAfter(self.SetSTCFocus, 1)
 
    def OnChar(self, event):
-      print "------------ OnChar() handler"
+      print("------------ OnChar() handler")
 
       if event.HasModifiers():
          if self.AutoCompActive():
@@ -535,7 +536,7 @@ class PrompterEditor(wx.stc.StyledTextCt
             self.__HandleFunctionKey(keycode)
 
          else:
-            key = unichr(key)
+            key = chr(key)
 
             self.parent.fileMenu.Enable(wx.ID_SAVE, True)
             self.parent.fileMenu.Enable(wx.ID_SAVEAS, True)
@@ -553,7 +554,7 @@ class PrompterEditor(wx.stc.StyledTextCt
       self.__ShowPrediction(string)
 
    def __ShowPrediction(self, string = ''):
-      print "------------ __ShowPrediction()"
+      print("------------ __ShowPrediction()")
       try:
          prefix = self.prsg.prefix()
          context = self.prsg.context()
@@ -565,18 +566,18 @@ class PrompterEditor(wx.stc.StyledTextCt
             self.prediction = self.__PrependFunctionLabel(self.prediction)
          self.suggestions = self.separator.join(self.prediction);
 
-      except presage.PresageException, ex:
-         print 'Caught exception %s' % (ex)
-         print '  code: %d' % (ex.code())
-         print '  what: %s' % (ex.what())
+      except presage.PresageException as ex:
+         print('Caught exception %s' % (ex))
+         print('  code: %d' % (ex.code()))
+         print('  what: %s' % (ex.what()))
          
 
-      print "String:         " + string
-      print "Prefix:         " + prefix
-      print "Prefix len:     " + str(len(prefix))
-      print "Context:        " + context
-      print "Context change: " + str(context_change)
-      print "Prediction:     " + self.suggestions
+      print("String:         " + string)
+      print("Prefix:         " + prefix)
+      print("Prefix len:     " + str(len(prefix)))
+      print("Context:        " + context)
+      print("Context change: " + str(context_change))
+      print("Prediction:     " + self.suggestions)
 
       if self.AutoCompActive():
          self.AutoCompCancel()
@@ -622,11 +623,11 @@ class PrompterEditor(wx.stc.StyledTextCt
       return result
 
    def __HandleFunctionKey(self, key):
-      print "Got function key " + str(key)
+      print("Got function key " + str(key))
 
       try:
          idx = self.function_keys.index(key)
-         print self.prediction[idx]
+         print(self.prediction[idx])
          if self.AutoCompActive():
             self.AutoCompCancel()
 
@@ -634,7 +635,7 @@ class PrompterEditor(wx.stc.StyledTextCt
          self.AutoCompSelect(self.prediction[idx])
          self.AutoCompComplete()
       except IndexError:
-         print 'Key not in prediction completion list'
+         print('Key not in prediction completion list')
    
    def __PrependFunctionLabel(self, prediction):
       return ['F' + str(i + 1) + ' ' + prediction[i] for i in range(len(prediction))]
@@ -646,15 +647,15 @@ class PrompterEditor(wx.stc.StyledTextCt
       return completion
 
    def OnUserListSelection(self, event):
-      completion = unicode(event.GetText())
+      completion = str(event.GetText())
       if self.function_keys_enabled:
          completion = self.__RemoveFunctionLabel(completion)
-      prefix_length = len(unicode(self.prsg.prefix()))
+      prefix_length = len(str(self.prsg.prefix()))
       
-      print "----------- OnUserListSelection() handler"
-      print "Completion:    " + completion
-      print "Prefix length: " + str(prefix_length)
-      print "To be added:   " + completion[prefix_length:]
+      print("----------- OnUserListSelection() handler")
+      print("Completion:    " + completion)
+      print("Prefix length: " + str(prefix_length))
+      print("To be added:   " + completion[prefix_length:])
 
       # no need to call complete, using callbacks
       #self.prsg.complete(completion.encode('utf-8'))
Index: presage-0.9.1/apps/dbus/presage_dbus_python_demo.in
===================================================================
--- presage-0.9.1.orig/apps/dbus/presage_dbus_python_demo.in
+++ presage-0.9.1/apps/dbus/presage_dbus_python_demo.in
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
 
 ##########
 #  Presage, an extensible predictive text entry system
@@ -32,13 +32,13 @@ PROGRAM_NAME = 'presage_dbus_python_demo
 
 config = None
 
-presage_service_name      = 'org.gnome.presage.beta'
-presage_service_path      = '/org/gnome/presage/beta'
+presage_service_name = 'org.gnome.presage.beta'
+presage_service_path = '/org/gnome/presage/beta'
 presage_service_interface = 'org.gnome.presage.beta'
 
 
 def disclaimer():
-	print """
+    print("""
 Presage dbus python demo
 ------------------------
 
@@ -51,19 +51,21 @@ Its intent is NOT to provide a predictiv
 
 Think of Presage as the predictive backend that sits behind a shiny
 user interface and does all the predictive heavy lifting.
-"""
+""")
+
 
 def print_version():
-	print """
+    print("""
 %s (%s) version %s
 Copyright (C) 2010 Matteo Vescovi.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
 to the extent permitted by law.
-""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@')
+""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@'))
+
 
 def print_usage():
-	print """
+    print("""
 Usage: %s [OPTION]...
 
 At the prompt, type in some text. Hit enter to generate a prediction.
@@ -74,29 +76,30 @@ Any text input is valid, including no te
   -v, --version        output version information and exit
 
 Direct your bug reports to: %s
-""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@')
+""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@'))
+
 
 def parse_cmd_line_args():
-	global config
+    global config
+
+    short_options = "c:s:hv"
+    long_options = ["config=", "suggestions=", "help", "version"]
+
+    try:
+        opts, _ = getopt.getopt(sys.argv[1:], short_options, long_options)
+    except getopt.GetoptError as err:
+        print(str(err))
+        sys.exit(1)
 
-	short_options = "c:s:hv"
-	long_options  = ["config=", "suggestions=", "help", "version"]
-	
-	try:
-		opts, args = getopt.getopt(sys.argv[1:], short_options, long_options)
-	except getopt.GetoptError, err:
-		print str(err)
-		sys.exit(1)
-
-	for opt, arg in opts:
-		if opt in ('-v', '--version'):
-			print_version()
-			sys.exit()
-		elif opt in ('-h', '--help'):
-			print_usage()
-			sys.exit()
-		elif opt in ('-c', '--config'):
-			config = arg
+    for opt, arg in opts:
+        if opt in ('-v', '--version'):
+            print_version()
+            sys.exit()
+        elif opt in ('-h', '--help'):
+            print_usage()
+            sys.exit()
+        elif opt in ('-c', '--config'):
+            config = arg
 
 
 def main():
@@ -107,32 +110,38 @@ def main():
     try:
         bus = dbus.SessionBus(gloop)
         if config:
-            presage_object_path = bus.get_object(presage_service_name, presage_service_path).get_presage_object_path(config)
+            presage_object_path = bus.get_object(
+                presage_service_name,
+                presage_service_path).get_presage_object_path(config)
         else:
-            presage_object_path = bus.get_object(presage_service_name, presage_service_path).get_presage_object_path()
+            presage_object_path = bus.get_object(
+                presage_service_name, presage_service_path).get_presage_object_path()
         # Get the Presage object
-        presage_object = bus.get_object(presage_service_name, presage_object_path)
+        presage_object = bus.get_object(
+            presage_service_name, presage_object_path)
 
-        print 'D-BUS connection to presage object %s created' % presage_object_path
+        print(
+            'D-BUS connection to presage object %s created' %
+            presage_object_path)
 
-    except Exception, e:
-        print e
+    except Exception as err:
+        print(err)
         sys.exit(1)
 
-    print "Enter text at the prompt (press enter on empty line to exit):"
+    print("Enter text at the prompt (press enter on empty line to exit):")
     string = None
     buffer = ""
     while string != "":
-        string = raw_input("> ")
+        string = input("> ")
         buffer += string
         results = presage_object.get_prediction(buffer, '')
         for result in results:
-            print str(result)
+            print(str(result))
     presage_object.destroy()
-    print "Goodbye"
+    print("Goodbye")
 
 
 if __name__ == '__main__':
-	parse_cmd_line_args()
-	disclaimer()
-	main()
+    parse_cmd_line_args()
+    disclaimer()
+    main()
Index: presage-0.9.1/apps/dbus/presage_dbus_service.py
===================================================================
--- presage-0.9.1.orig/apps/dbus/presage_dbus_service.py
+++ presage-0.9.1/apps/dbus/presage_dbus_service.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
 
 ##########
 #  Presage, an extensible predictive text entry system
@@ -72,7 +72,7 @@ class PresageObject(dbus.service.Object)
         self.callback = DbusPresageCallback().__disown__()
         self.prsg = presage.Presage(self.callback, config)
         dbus.service.Object.__init__(self, name, self.path)
-        print 'Created presage object %s' % self.path
+        print('Created presage object %s' % self.path)
 
 #    def __del__( self ):
 #        print 'PresageObject destroyed: ', self 
@@ -88,7 +88,7 @@ class PresageObject(dbus.service.Object)
     @dbus.service.method(dbus_interface = presage_service_interface)
     def destroy(self):
         self.remove_from_connection()
-        print 'Removed presage object ' + self.path
+        print('Removed presage object ' + self.path)
 
 
 class PresageService(dbus.service.Object):
@@ -98,7 +98,7 @@ class PresageService(dbus.service.Object
         self.path = presage_service_path
         self.loop = loop
         dbus.service.Object.__init__(self, self.name, self.path)
-        print 'Service %s created, pid %d' % (presage_service_name, os.getpid())
+        print('Service %s created, pid %d' % (presage_service_name, os.getpid()))
 
     @dbus.service.method(dbus_interface = presage_service_interface,
                          in_signature = 's',
@@ -112,11 +112,11 @@ class PresageService(dbus.service.Object
                          out_signature = '')
     def shutdown(self):
         self.loop.quit()
-        print 'Service %s shutdown' % presage_service_name
+        print('Service %s shutdown' % presage_service_name)
 
 
 def start():
-    print 'Starting ' + presage_service_name + '...'
+    print('Starting ' + presage_service_name + '...')
 
     dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
     loop = gobject.MainLoop()
@@ -124,16 +124,16 @@ def start():
     loop.run()
 
 def stop():
-    print 'Stopping ' + presage_service_name + '...'
+    print('Stopping ' + presage_service_name + '...')
     try:
         dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
         bus = dbus.SessionBus()
         presage_service_object = bus.get_object(presage_service_name, presage_service_path)
         presage_service_object.shutdown()
 
-    except Exception, e:
-        print 'Caught exception while attempting to stop ' + presage_service_name
-        print e
+    except Exception as err:
+        print('Caught exception while attempting to stop ' + presage_service_name)
+        print(err)
         
 if __name__ == '__main__':
     start()
Index: presage-0.9.1/apps/python/presagemate/presagemate.py
===================================================================
--- presage-0.9.1.orig/apps/python/presagemate/presagemate.py
+++ presage-0.9.1/apps/python/presagemate/presagemate.py
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 ##########
 #  Presage, an extensible predictive text entry system
@@ -24,8 +24,8 @@ import string
 
 try:
    import presage
-except ImportError, ex:
-   print '''
+except ImportError as ex:
+   print('''
 Error: failed to import module presage.
 
 Check that presage python binding is properly installed (if
@@ -35,11 +35,11 @@ accordingly).
 Check that presage library is properly installed (if installed in a
 non-standard location, please set LD_LIBRARY_PATH (PATH, LIBPATH)
 accordingly).
-'''
+''')
 try:
     import pyatspi
-except ImportError, ex:
-   print '''
+except ImportError as ex:
+   print('''
 Error: failed to import module pyatspi.
 
 Check that pyatspi python binding is properly installed (if
@@ -49,12 +49,14 @@ accordingly).
 Check that pyatspi library is properly installed (if installed in a
 non-standard location, please set LD_LIBRARY_PATH (PATH, LIBPATH)
 accordingly).
-'''
+''')
    
 try:
-    import gtk
-except ImportError, ex:
-   print '''
+    import gi
+    gi.require_version('Gtk', '3.0')
+    from gi.repository import Gtk as gtk, Gdk as gdk
+except ImportError as ex:
+   print('''
 Error: failed to import module gtk.
 
 Check that gtk python binding is properly installed (if
@@ -64,12 +66,12 @@ accordingly).
 Check that gtk library is properly installed (if installed in a
 non-standard location, please set LD_LIBRARY_PATH (PATH, LIBPATH)
 accordingly).
-'''
+''')
 
 
-import ConfigParser
+import configparser
 import os
-import pango
+from gi.repository import Pango as pango
 import atexit
 import Xlib
 import Xlib.display
@@ -129,11 +131,11 @@ def process_event(event):
            
            completion = prsg.completion(predicted_word)
            
-           print 'Prediction: ' + predicted_word
-           print 'Completion: ' + completion
+           print('Prediction: ' + predicted_word)
+           print('Completion: ' + completion)
            
            for ch in completion:
-              keyval = gtk.gdk.unicode_to_keyval(ord(ch))
+              keyval = gdk.unicode_to_keyval(ord(ch))
               reg.generateKeyboardEvent(keyval, None, pyatspi.KEY_SYM)
            
            callback.buffer += completion
@@ -173,7 +175,7 @@ def delete_event(widget, event, data=Non
 
 def frame_event(window, event, data=None):
    state = event.new_window_state
-   if state & gtk.gdk.WINDOW_STATE_ICONIFIED:
+   if state & gdk.WindowState.ICONIFIED:
       # re-map F1-10 to F1-10 when the window is iconified
       remap_keys(False)
    else:
@@ -182,7 +184,7 @@ def frame_event(window, event, data=None
 
 def get_config():
    writeconfig_flag = False
-   config = ConfigParser.SafeConfigParser()
+   config = configparser.ConfigParser()
    config.read(os.path.expanduser('~/.pypresagematerc'))
 
    if config.has_section('Config') == False:
@@ -207,7 +209,7 @@ def get_config():
       writeconfig_flag = True
    
    if writeconfig_flag == True:
-      configfile = open(os.path.expanduser('~/.pypresagematerc'), 'wb')
+      configfile = open(os.path.expanduser('~/.pypresagematerc'), 'w')
       try:
          config.write(configfile)
       finally:
@@ -216,11 +218,11 @@ def get_config():
    return config
 
 def set_position_config(x, y):
-   config = ConfigParser.SafeConfigParser()
+   config = configparser.ConfigParser()
    config.read(os.path.expanduser('~/.pypresagematerc'))
    config.set('Config', 'window_position_x', str(x))
    config.set('Config', 'window_position_y', str(y))
-   configfile = open(os.path.expanduser('~/.pypresagematerc'), 'wb')
+   configfile = open(os.path.expanduser('~/.pypresagematerc'), 'w')
    try:
       config.write(configfile)
    finally:
@@ -279,15 +281,15 @@ def remap_keys(remap):
 
 def popup_menu(widget, event):
    if event.button == 3:
-      menu.popup(None, None, None, event.button, event.time) 
+      menu.popup(None, None, None, None, event.button, event.time) 
       return True
    return False
 
 def apply_preferences(widget):
-   print "apply"
+   print("apply")
   
 def close_preferences(widget):
-   print "close"
+   print("close")
 
 def update_no_selections(widget):
    global number_of_suggestions
@@ -297,14 +299,14 @@ def update_no_selections(widget):
    remap_keys(True)
 
 def preferences(widget):
-   preferences = gtk.Window(gtk.WINDOW_TOPLEVEL)
+   preferences = gtk.Window(gtk.WindowType.TOPLEVEL)
    preferences.set_title("pypresagemate preferences")
-   preferences.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
+   preferences.set_type_hint(gdk.WindowTypeHint.DIALOG)
   
    preferences_box = gtk.VBox()
    
    notebook = gtk.Notebook()
-   notebook.set_tab_pos(gtk.POS_TOP)
+   notebook.set_tab_pos(gtk.PositionType.TOP)
    
    appearance_frame = gtk.Frame()
    appearance_tab = gtk.Label("Appearance")
@@ -319,7 +321,8 @@ def preferences(widget):
    
    presage_placeholder = gtk.Label("\n\nPresage library configuration\n\n")
    adj = gtk.Adjustment(float(number_of_suggestions), 3, 10, 1, 0, 0)
-   no_of_selections = gtk.SpinButton(adj, 0, 0)
+   no_of_selections = gtk.SpinButton()
+   no_of_selections.configure(adj, 0, 0)
    no_of_selections.connect("output", update_no_selections)
    presage_frame.add(no_of_selections)
    
@@ -366,7 +369,7 @@ with this program; if not, write to the
    about.set_website("http://presage.sourceforge.net/")
    about.set_comments(comments)
    if os.path.isfile("/usr/local/share/presage/presage.png"):
-      about.set_logo(gtk.gdk.pixbuf_new_from_file("/usr/local/share/presage/presage.png"))
+      about.set_logo(gdk.pixbuf_new_from_file("/usr/local/share/presage/presage.png"))
    about.run()
    about.destroy()
 
@@ -410,7 +413,7 @@ prediction = prsg.predict()
 
 reg.registerKeystrokeListener(process_event, mask=pyatspi.allModifiers())
 
-window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+window = gtk.Window(gtk.WindowType.TOPLEVEL)
 window.connect("delete-event", delete_event)
 window.connect("window-state-event", frame_event)
 
@@ -419,17 +422,17 @@ window.set_keep_above(True)
 
 window.move(window_position_x, window_position_y)
 
-window.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse("#c0c0ff"))
+window.modify_bg(gtk.StateType.NORMAL, gdk.color_parse("#c0c0ff"))
 
 label = gtk.Label("pypresagemate")
-label.set_justify(gtk.JUSTIFY_LEFT)
+label.set_justify(gtk.Justification.LEFT)
 label.set_width_chars(20)
 
 font_desc = pango.FontDescription(pangofont)
 label.modify_font(font_desc)
 
 window.connect("button-press-event", popup_menu)
-window.add_events(gtk.gdk.BUTTON_PRESS_MASK)
+window.add_events(gdk.EventMask.BUTTON_PRESS_MASK)
 
 menu = gtk.Menu()
 menu_item1 = gtk.MenuItem('About')
Index: presage-0.9.1/apps/python/pypresagemate.in
===================================================================
--- presage-0.9.1.orig/apps/python/pypresagemate.in
+++ presage-0.9.1/apps/python/pypresagemate.in
@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/python3
 
 ##########
 #  Presage, an extensible predictive text entry system
@@ -27,17 +27,17 @@ import os
 PROGRAM_NAME = 'pypresagemate'
 
 def print_version():
-   print """
+   print("""
 %s (%s) version %s
 Copyright (C) 2010 Matteo Vescovi.
 Copyright (C) 2010 John Hills.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
 to the extent permitted by law.
-""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@')
+""" % (PROGRAM_NAME, '@PACKAGE_NAME@', '@PACKAGE_VERSION@'))
 
 def print_usage():
-   print """
+   print("""
 Usage: %s [options]
 
 Options:
@@ -54,16 +54,16 @@ keystrokes are typed and displaying pred
 prediction is selected, text is sent to the active application.
 
 Direct your bug reports to: %s
-""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@')
+""" % (PROGRAM_NAME, '@PACKAGE_BUGREPORT@'))
 
 def parse_cmd_line_args():
    short_options = "hv"
    long_options  = ["help", "version"]
    
    try:
-      opts, args = getopt.getopt(sys.argv[1:], short_options, long_options)
-   except getopt.GetoptError, err:
-      print str(err)
+      opts, _ = getopt.getopt(sys.argv[1:], short_options, long_options)
+   except getopt.GetoptError as err:
+      print(str(err))
       sys.exit(1)
    
    for opt, arg in opts:
@@ -80,14 +80,14 @@ if __name__ == "__main__":
 
    try:
       import presagemate.presagemate
-   except ImportError, e:
-      print '''
+   except ImportError as err:
+      print('''
 Error: failed to import module presagemate.
 
 Check that prompter is properly installed (if installed in a
 non-standard location, please set PYTHONPATH accordingly).
-'''
-      print e
+''')
+      print(err)
    else:
       if not config:
          # try to locate presage.xml config file
@@ -101,4 +101,4 @@ non-standard location, please set PYTHON
             conffile = os.path.join(scriptdir, '..', 'etc', 'presage.xml')
             if os.path.isfile(conffile):
                config = conffile
-         print 'Configuration file: ' + str(config)
+         print('Configuration file: ' + str(config))
Index: presage-0.9.1/apps/dbus/presage_dbus_python_demo
===================================================================
--- presage-0.9.1.orig/apps/dbus/presage_dbus_python_demo
+++ presage-0.9.1/apps/dbus/presage_dbus_python_demo
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
 
 ##########
 #  Presage, an extensible predictive text entry system
Index: presage-0.9.1/apps/dbus/presage_dbus_service
===================================================================
--- presage-0.9.1.orig/apps/dbus/presage_dbus_service
+++ presage-0.9.1/apps/dbus/presage_dbus_service
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
 
 ##########
 #  Presage, an extensible predictive text entry system
openSUSE Build Service is sponsored by