[python-bugzilla] Patch for Python 3 Support

Ralph Bean rbean at redhat.com
Tue Jun 26 17:08:02 UTC 2012


On Mon, Jun 25, 2012 at 10:39:48PM -0700, Toshio Kuratomi wrote:
> * Needs python-2.6 or greater (as python-2.5 doesn't have from __future__
>   import print_function, the new format of "except Foo as bar:", and
>   relative imports)

This is correct.  Can anyone comment on what python versions
python-bugzilla is required to support?  EPEL6 is on python-2.6 now.

> * New dependency on python-six

Correct.

> * There are places that str(foo) is used that haven't been converted to
>   a six.XXX() method.  These might fail in some circumstances.

I took on the remainder of these in one of the new patches listed below.

> * Note: the to_encoding() function looks to handle edge cases wrong.  This
>   would become more apparent in python3 than in python2.  It looks like it's
>   intended to take a unicode string or a byte string and return a byte
>   string.  However, if the parameter passed in is neither a unicode nor
>   a byte string, it will return an empty unicode string.  This will likely
>   trigger tracebacks in python3 where bytes and unicode cannot be combined
>   implictly.

Nice catch!  I fixed to_encoding so it always returns byte strings now.

> * Note2: Some of the lines that use to_encoding() look like they can still
>   throw exceptions.  they look like they can mix unicode and bytes in some
>   circumstances.  Running with python-unicodenazi installed and enabled (see
>   that package's documentation) might find some of these cases.

I went through all the uses of it and couldn't find anywhere where byte or
unicode strings are implicitly coerced.  I checked the fields in query
results and in every case I tested, they were unicode strings (thus
making it all consistent).  unicode-nazi only complained about some stuff in
stdlib.

> * This might better be rewritten:
>          to_remove = [k for k in query.keys() if query[k] is None]
>          for key in to_remove:
>              del query[key]
>   as this:
>          query = dict(((k, v) for k, v  in six.iteritems(query) if  v is not None))

Done!  (The *original* loop modified the dict during iteration;
illegal in Python 3).

Here's my list of updated patches (including a rename of my original).
I kept them separated out instead of rebasing just to preserve
history and make them easier to cherry-pick.

  http://threebean.org/patches/python-bugzilla/0001-Python3-support.patch
  http://threebean.org/patches/python-bugzilla/0002-Replace-str-foo-with-six.text_type-foo.patch
  http://threebean.org/patches/python-bugzilla/0003-Rewrite-two-loops-as-one-generator.patch
  http://threebean.org/patches/python-bugzilla/0004-Regression-fix.patch
  http://threebean.org/patches/python-bugzilla/0005-Always-return-bytestrings-from-to_encoding.patch

-Ralph


More information about the python-bugzilla mailing list