[pycanberra] Add a python3 subpackage

Mathieu Bridon bochecha at fedoraproject.org
Wed Feb 6 08:47:22 UTC 2013


commit 3576ac401ef86d15c83cd9191f6ebd1fe528ac58
Author: Mathieu Bridon <bochecha at fedoraproject.org>
Date:   Wed Feb 6 16:46:18 2013 +0800

    Add a python3 subpackage

 0001-Do-not-use-the-exceptions-module.patch        |   54 ++++++++++++++
 ...strings-passed-to-libcanberra-are-byte-st.patch |   78 ++++++++++++++++++++
 pycanberra.spec                                    |   34 ++++++++-
 3 files changed, 163 insertions(+), 3 deletions(-)
---
diff --git a/0001-Do-not-use-the-exceptions-module.patch b/0001-Do-not-use-the-exceptions-module.patch
new file mode 100644
index 0000000..e999c59
--- /dev/null
+++ b/0001-Do-not-use-the-exceptions-module.patch
@@ -0,0 +1,54 @@
+From 2023730c6ece6edf6ddb8f73d80409230fc06089 Mon Sep 17 00:00:00 2001
+From: Mathieu Bridon <bochecha at fedoraproject.org>
+Date: Wed, 28 Nov 2012 23:44:39 +0800
+Subject: [PATCH 1/2] Do not use the exceptions module
+
+On Python 2, it is imported automatically, so there really isn't any
+need to import it, it's classes can be used directly:
+    $ python2
+    >>> e = Exception()
+    >>> import exceptions
+    >>> isinstance(e, exceptions.Exception)
+    True
+
+Also, it doesn't exist on Python 3, so removing it will make the port
+easier.
+---
+ pycanberra.py | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+diff --git a/pycanberra.py b/pycanberra.py
+index 6b1a064..a1bae5d 100644
+--- a/pycanberra.py
++++ b/pycanberra.py
+@@ -4,7 +4,6 @@
+ # License: LGPL 2.1
+ ##########################################################################
+ from ctypes import *
+-import exceptions
+ import time
+ 
+ # /**
+@@ -519,16 +518,16 @@ def GetApi():
+ # int ca_proplist_set(ca_proplist *p, const char *key, const void *data, size_t nbytes);
+ 
+ 
+-class CanberraException(exceptions.Exception):
++class CanberraException(Exception):
+    def __init__(self, err, *args, **kwargs):
+       self._err = err
+-      super(exceptions.Exception, self).__init__(*args, **kwargs)
++      super(Exception, self).__init__(*args, **kwargs)
+ 
+    def get_error(self):
+       return self._err
+ 
+    def __str__(self):
+-      return super(exceptions.Exception, self).__str__() + " (error %d)" % self._err
++      return super(Exception, self).__str__() + " (error %d)" % self._err
+    
+ 
+ class Canberra(object):
+-- 
+1.8.1
+
diff --git a/0002-Ensure-all-strings-passed-to-libcanberra-are-byte-st.patch b/0002-Ensure-all-strings-passed-to-libcanberra-are-byte-st.patch
new file mode 100644
index 0000000..74348da
--- /dev/null
+++ b/0002-Ensure-all-strings-passed-to-libcanberra-are-byte-st.patch
@@ -0,0 +1,78 @@
+From e1104818d795bde79e203ba750ce37fbba9a8e90 Mon Sep 17 00:00:00 2001
+From: Mathieu Bridon <bochecha at fedoraproject.org>
+Date: Wed, 2 Jan 2013 19:26:23 +0800
+Subject: [PATCH 2/2] Ensure all strings passed to libcanberra are byte strings
+
+We need to pass byte strings to libcanberra, which is default with
+Python 2 when defining a string as "foo".
+
+However, on Python 3, the same definition gives a unicode string, which
+libcanberra can't handle.
+
+To avoid forcing applications to change the way they called pycanberra
+on Python 2, pycanberra now quickly ensures that all strings it handles
+are encoded to bytes, if they weren't already.
+---
+ pycanberra.py | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+diff --git a/pycanberra.py b/pycanberra.py
+index a1bae5d..0d219ba 100644
+--- a/pycanberra.py
++++ b/pycanberra.py
+@@ -6,6 +6,18 @@
+ from ctypes import *
+ import time
+ 
++# This is inspired by the six module: http://pypi.python.org/pypi/six
++import sys
++if sys.version_info.major == 3:
++    string_types = str,
++    def b(s):
++        return s.encode("latin-1")
++else:
++    string_types = basestring,
++    def b(s):
++        return s
++
++
+ # /**
+ #  * CA_PROP_MEDIA_NAME:
+ #  *
+@@ -556,6 +568,8 @@ class Canberra(object):
+          raise CanberraException(res, "Failed to destroy context")
+ 
+    def change_props(self, *args):
++      args = tuple(b(arg) if isinstance(arg, string_types) else arg
++                   for arg in args)
+       res = GetApi().ca_context_change_props(self._handle, *args)
+       if res != CA_SUCCESS:
+          raise CanberraException(res, "Failed to change props")
+@@ -573,11 +587,15 @@ class Canberra(object):
+       pass
+ 
+    def play(self, playId, *args):
++      args = tuple(b(arg) if isinstance(arg, string_types) else arg
++                   for arg in args)
+       res = GetApi().ca_context_play(self._handle, playId, *args)
+       if res != CA_SUCCESS:
+          raise CanberraException(res, "Failed to play!")
+ 
+    def cache(self, *args):
++      args = tuple(b(arg) if isinstance(arg, string_types) else arg
++                   for arg in args)
+       res = GetApi().ca_context_cache(self._handle, *args)
+       if res != CA_SUCCESS:
+          raise CanberraException(res, "Failed to cache")
+@@ -596,6 +614,8 @@ class Canberra(object):
+ 
+    def easy_play_sync(self, eventName):
+       """ play an event sound synchronously """
++      if isinstance(eventName, string_types):
++          eventName = b(eventName)
+       self.play(1,
+                 CA_PROP_EVENT_ID, eventName,
+                 None)
+-- 
+1.8.1
+
diff --git a/pycanberra.spec b/pycanberra.spec
index c4604f0..58a46ec 100644
--- a/pycanberra.spec
+++ b/pycanberra.spec
@@ -6,7 +6,7 @@ License:       LGPLv2
 
 # There's no versioning upstream, it's all about the Git hash
 Version:       0
-Release:       0.2.git%{git_hash}%{?dist}
+Release:       0.3.git%{git_hash}%{?dist}
 
 URL:           https://github.com/psykoyiko/pycanberra/
 
@@ -17,22 +17,38 @@ URL:           https://github.com/psykoyiko/pycanberra/
 #     $ git archive --prefix=pycanberra-$GIT_HASH/ --format=tar HEAD | xz > pycanberra-git.$GIT_HASH.tar.xz
 Source0:       %{name}-git.%{git_hash}.tar.xz
 
+# I submitted these patches upstream, but they haven't been accepted yet
+#     https://github.com/psykoyiko/pycanberra/pull/2
+# I'm pulling them in the package because other packages need pycanberra with
+# Python 3 (e.g gnome-clocks)
+Patch0:        0001-Do-not-use-the-exceptions-module.patch
+Patch1:        0002-Ensure-all-strings-passed-to-libcanberra-are-byte-st.patch
+
 BuildArch:     noarch
 
 BuildRequires: python2-devel
+BuildRequires: python3-devel
 
 # This will break at run time when libcanberra bumps its soname :(
 Requires:      libcanberra
 
 %description
-A very basic (and incomplete) wrapper for libcanberra.
+A very basic (and incomplete) wrapper of libcanberra for Python 2.
+
 
-This is necessary until libcanberra gets proper GObject Introspection support.
+%package -n python3-canberra
+Summary:       A very basic (and incomplete) wrapper for libcanberra
+
+%description -n python3-canberra
+A very basic (and incomplete) wrapper of libcanberra for Python 3.
 
 
 %prep
 %setup -q -n pycanberra-%{git_hash}
 
+%patch0 -p1
+%patch1 -p1
+
 
 %build
 # Nothing to build
@@ -42,13 +58,25 @@ This is necessary until libcanberra gets proper GObject Introspection support.
 install -d %{buildroot}%{python_sitelib}
 install -p -m 0644 pycanberra.py %{buildroot}%{python_sitelib}
 
+install -d %{buildroot}%{python3_sitelib}
+install -p -m 0644 pycanberra.py %{buildroot}%{python3_sitelib}
+
 
 %files
 %doc COPYING README
 %{python_sitelib}/pycanberra.py*
 
+%files -n python3-canberra
+%doc COPYING README
+%{python3_sitelib}/pycanberra.py
+%{python3_sitelib}/__pycache__/pycanberra.cpython-33.py?
+
+
 
 %changelog
+* Wed Feb 06 2013 Mathieu Bridon <bochecha at fedoraproject.org> - 0-0.3.git65c3b3f
+- Add a python3 subpackage.
+
 * Tue Oct 02 2012 Mathieu Bridon <bochecha at fedoraproject.org> - 0-0.2.git65c3b3f
 - Fix requirement on libcanberra.
 


More information about the scm-commits mailing list