Hello community, here is the log from the commit of package python-djvulibre for openSUSE:Factory checked in at 2016-03-26 15:29:24 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-djvulibre (Old) and /work/SRC/openSUSE:Factory/.python-djvulibre.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-djvulibre" Changes: -------- --- /work/SRC/openSUSE:Factory/python-djvulibre/python-djvulibre.changes 2015-09-11 09:04:18.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.python-djvulibre.new/python-djvulibre.changes 2016-03-26 18:12:33.000000000 +0100 @@ -1,0 +2,11 @@ +Sat Mar 12 16:18:34 UTC 2016 - lazy.k...@opensuse.org + +- Update to 0.7.1. + * Update URL for “actual and proposed changes to the DjVu + format”. + * Use HTTPS for sourceforge.net URLs. + * Fix a few typos in the documentation. + * Improve the test suite: + + Normalize whitespace in ps2ascii output. + +------------------------------------------------------------------- Old: ---- python-djvulibre-0.7.tar.gz python-djvulibre-0.7.tar.gz.asc New: ---- python-djvulibre-0.7.1.tar.gz python-djvulibre-0.7.1.tar.gz.asc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-djvulibre.spec ++++++ --- /var/tmp/diff_new_pack.BCdLUW/_old 2016-03-26 18:12:34.000000000 +0100 +++ /var/tmp/diff_new_pack.BCdLUW/_new 2016-03-26 18:12:34.000000000 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-djvulibre # -# Copyright (c) 2015 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -17,7 +17,7 @@ Name: python-djvulibre -Version: 0.7 +Version: 0.7.1 Release: 0 Summary: Python Support for the DjVu Image Format License: GPL-2.0 ++++++ python-djvulibre-0.7.tar.gz -> python-djvulibre-0.7.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/MANIFEST.in new/python-djvulibre-0.7.1/MANIFEST.in --- old/python-djvulibre-0.7/MANIFEST.in 2015-08-25 23:24:28.000000000 +0200 +++ new/python-djvulibre-0.7.1/MANIFEST.in 2015-11-22 17:36:56.000000000 +0100 @@ -10,6 +10,6 @@ recursive-include djvu *.py *.pxi *.pxd *.pyx -recursive-include tests *.py Makefile *.jpeg *.tex *.djvu +recursive-include tests *.py Makefile *.tex *.djvu include private/* diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/PKG-INFO new/python-djvulibre-0.7.1/PKG-INFO --- old/python-djvulibre-0.7/PKG-INFO 2015-08-26 00:05:18.000000000 +0200 +++ new/python-djvulibre-0.7.1/PKG-INFO 2016-03-11 22:34:27.000000000 +0100 @@ -1,14 +1,14 @@ Metadata-Version: 1.1 Name: python-djvulibre -Version: 0.7 +Version: 0.7.1 Summary: Python support for the DjVu image format Home-page: http://jwilk.net/software/python-djvulibre Author: Jakub Wilk Author-email: jw...@jwilk.net License: GNU GPL 2 -Description: *python-djvulibre* is a set of `Python <https://www.python.org>`_ bindings for - the `DjVuLibre <http://djvu.sf.net/>`_ library, an open source implementation - of `DjVu <http://djvu.org/>`_. +Description: *python-djvulibre* is a set of Python bindings for + the `DjVuLibre <http://djvu.sourceforge.net/>`_ library, + an open source implementation of `DjVu <http://djvu.org/>`_. Platform: all Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/djvu/const.py new/python-djvulibre-0.7.1/djvu/const.py --- old/python-djvulibre-0.7/djvu/const.py 2015-08-21 16:46:44.000000000 +0200 +++ new/python-djvulibre-0.7.1/djvu/const.py 2015-11-23 15:51:16.000000000 +0100 @@ -57,7 +57,7 @@ Subject Title Trapped'''.split()) -# Retrived from the PDF specification +# Retrieved from the PDF specification METADATA_KEYS = METADATA_BIBTEX_KEYS | METADATA_PDFINFO_KEYS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/djvu/decode.pyx new/python-djvulibre-0.7.1/djvu/decode.pyx --- old/python-djvulibre-0.7/djvu/decode.pyx 2015-08-18 15:48:05.000000000 +0200 +++ new/python-djvulibre-0.7.1/djvu/decode.pyx 2016-03-11 21:52:23.000000000 +0100 @@ -684,7 +684,7 @@ raise KeyError(key) if self._page_map is None: self._page_map = {} - for i from 0 <= i < len(self): + for i in range(len(self)): file = File(self._document, i, sentinel = the_sentinel) n_page = file.n_page if n_page is not None: @@ -897,7 +897,7 @@ pages = sorted(frozenset(pages)) else: pages = list(pages) - for i from 0 <= i < len(pages): + for i in range(len(pages)): if not is_int(pages[i]): raise TypeError('page numbers must be integers') if pages[i] < 0: @@ -1178,7 +1178,7 @@ RENDER_FOREGROUND render only the foreground layer RENDER_BACKGROUND - redner only the background layer + render only the background layer zoom Specifies a zoom factor. The default zoom factor scales the image to fit the page. @@ -1314,22 +1314,23 @@ cdef const char **optv cdef int optc cdef size_t buffer_size - optc = 0 buffer_size = len(options) * sizeof (char*) optv = <const char**> py_malloc(buffer_size) if optv == NULL: raise MemoryError('Unable to allocate {0} bytes for print options'.format(buffer_size)) try: - for optc from 0 <= optc < len(options): + for optc in range(len(options)): option = options[optc] if is_unicode(option): options[optc] = option = encode_utf8(option) optv[optc] = option - assert optc == len(options) with nogil: acquire_lock(loft_lock, WAIT_LOCK) try: job = SaveJob(sentinel = the_sentinel) - job.__init(self._context, ddjvu_document_print(self.ddjvu_document, output, optc, optv)) + job.__init( + self._context, + ddjvu_document_print(self.ddjvu_document, output, len(options), optv) + ) job._file = file_wrapper finally: release_lock(loft_lock) @@ -1528,7 +1529,7 @@ - The URI is used as a key for the cache of decoded pages. - The URI is used to document NewStreamMessage messages. - Setting argument cache to a true vaule indicates that decoded pages + Setting argument cache to a true value indicates that decoded pages should be cached when possible. It is important to understand that the URI is not used to access the @@ -1833,9 +1834,9 @@ def __cinit__(self, palette, unsigned int bpp = 8): cdef int i, j, k, n - for i from 0 <= i < 6: - for j from 0 <= j < 6: - for k from 0 <= k < 6: + for i in range(6): + for j in range(6): + for k in range(6): n = palette[(i, j, k)] if not 0 <= n < 0x100: raise ValueError('palette entries must be in range(0, 0x100)') @@ -1846,12 +1847,12 @@ self.ddjvu_format = ddjvu_format_create(DDJVU_FORMAT_PALETTE8, 216, self._palette) def __repr__(self): - cdef int i + cdef int i, j, k io = StringIO() io.write(get_type_name(PixelFormatPalette) + '({') - for i from 0 <= i < 6: - for j from 0 <= j < 6: - for k from 0 <= k < 6: + for i in range(6): + for j in range(6): + for k in range(6): io.write('({i}, {j}, {k}): 0x{v:02x}'.format(i=i, j=j, k=k, v=self._palette[i * 6 * 6 + j * 6 + k])) if not (i == j == k == 5): io.write(', ') @@ -2648,7 +2649,7 @@ It indicates that the decoder needs to access the data in the main DjVu file. - Further NewStreamMessage messages messages are generated to access the + Further NewStreamMessage messages are generated to access the auxiliary files of indirect or indexed DjVu documents. .name then provides the base name of the auxiliary file. ''' @@ -2657,9 +2658,9 @@ property uri: ''' - Return the requrested URI. + Return the requested URI. - URI is is set according to the uri argument provided to function + URI is set according to the uri argument provided to function Context.new_document(). The first NewMessageStream message always contain the URI passed to Context.new_document(). Subsequent NewMessageStream messages contain the URI of the auxiliary files for diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/doc/api/conf.py new/python-djvulibre-0.7.1/doc/api/conf.py --- old/python-djvulibre-0.7/doc/api/conf.py 2015-08-18 10:36:08.000000000 +0200 +++ new/python-djvulibre-0.7.1/doc/api/conf.py 2016-02-11 00:14:39.000000000 +0100 @@ -60,7 +60,7 @@ .. _djvused: http://djvu.sourceforge.net/doc/man/djvused.html .. |djvuext| replace:: Actual and proposed changes to the DjVu format -.. _djvuext: http://djvu.git.sourceforge.net/git/gitweb.cgi?p=djvu/djvulibre.git;a=blob;f=doc/djvuchanges.txt;hb=refs/tags/release.3.5.23 +.. _djvuext: https://sourceforge.net/p/djvu/djvulibre-git/ci/release.3.5.23/tree/doc/djvuchanges.txt ''' # vim:ts=4 sts=4 sw=4 et diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/doc/api/event-model.rst new/python-djvulibre-0.7.1/doc/api/event-model.rst --- old/python-djvulibre-0.7/doc/api/event-model.rst 2015-08-16 14:59:46.000000000 +0200 +++ new/python-djvulibre-0.7.1/doc/api/event-model.rst 2015-11-23 15:52:07.000000000 +0100 @@ -59,7 +59,7 @@ - The URI is used as a key for the cache of decoded pages. - The URI is used to document :class:`NewStreamMessage` messages. - Setting argument `cache` to a true vaule indicates that decoded pages + Setting argument `cache` to a true value indicates that decoded pages should be cached when possible. It is important to understand that the URI is not used to access the diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/doc/api/expressions.rst new/python-djvulibre-0.7.1/doc/api/expressions.rst --- old/python-djvulibre-0.7/doc/api/expressions.rst 2015-08-16 14:59:46.000000000 +0200 +++ new/python-djvulibre-0.7.1/doc/api/expressions.rst 2016-03-11 21:51:39.000000000 +0100 @@ -137,8 +137,8 @@ >>> x.value Symbol('ham') -Variétés --------- +Varieties +--------- .. data:: EMPTY_LIST Empty list S-expression. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/doc/api/messages.rst new/python-djvulibre-0.7.1/doc/api/messages.rst --- old/python-djvulibre-0.7/doc/api/messages.rst 2015-08-16 14:59:46.000000000 +0200 +++ new/python-djvulibre-0.7.1/doc/api/messages.rst 2016-01-15 18:16:40.000000000 +0100 @@ -82,16 +82,16 @@ to ``None``. It indicates that the decoder needs to access the data in the main DjVu file. - Further :class:`NewStreamMessage` messages messages are generated to access the + Further :class:`NewStreamMessage` messages are generated to access the auxiliary files of indirect or indexed DjVu documents. :attr:`name` then provides the base name of the auxiliary file. .. attribute:: uri - :return: the requrested URI. + :return: the requested URI. - URI is is set according to the `uri` argument provided to function + URI is set according to the `uri` argument provided to function :meth:`Context.new_document`. The first :class:`NewStreamMessage` message always contain the URI passed to :meth:`Context.new_document`. Subsequent :class:`NewStreamMessage` messages contain the URI of the diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/doc/api/text-zones.rst new/python-djvulibre-0.7.1/doc/api/text-zones.rst --- old/python-djvulibre-0.7/doc/api/text-zones.rst 2015-08-16 14:59:46.000000000 +0200 +++ new/python-djvulibre-0.7.1/doc/api/text-zones.rst 2015-11-23 15:51:49.000000000 +0100 @@ -112,7 +112,7 @@ .. currentmodule:: djvu.const .. data:: TEXT_ZONE_SEPARATORS - Dictionary that maps text types to their seprators. + Dictionary that maps text types to their separators. >>> pprint(TEXT_ZONE_SEPARATORS) {<djvu.const.TextZoneType: char>: '', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/doc/changelog new/python-djvulibre-0.7.1/doc/changelog --- old/python-djvulibre-0.7/doc/changelog 2015-08-25 23:46:21.000000000 +0200 +++ new/python-djvulibre-0.7.1/doc/changelog 2016-03-11 22:09:02.000000000 +0100 @@ -1,3 +1,13 @@ +python-djvulibre (0.7.1) unstable; urgency=low + + * Update URL for “actual and proposed changes to the DjVu format”. + * Use HTTPS for sourceforge.net URLs. + * Fix a few typos in the documentation. + * Improve the test suite: + + Normalize whitespace in ps2ascii output. + + -- Jakub Wilk <jw...@jwilk.net> Fri, 11 Mar 2016 22:09:00 +0100 + python-djvulibre (0.7) unstable; urgency=low * Make Expression.from_string() accept both Unicode and byte strings. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/examples/djvu-crop-text new/python-djvulibre-0.7.1/examples/djvu-crop-text --- old/python-djvulibre-0.7/examples/djvu-crop-text 2015-08-18 10:36:08.000000000 +0200 +++ new/python-djvulibre-0.7.1/examples/djvu-crop-text 2015-09-04 23:57:59.000000000 +0200 @@ -18,7 +18,6 @@ import argparse import os -import subprocess import sys import djvu.const diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/examples/djvu-dump-text new/python-djvulibre-0.7.1/examples/djvu-dump-text --- old/python-djvulibre-0.7/examples/djvu-dump-text 2015-08-18 10:36:08.000000000 +0200 +++ new/python-djvulibre-0.7.1/examples/djvu-dump-text 2015-09-04 23:58:27.000000000 +0200 @@ -47,7 +47,7 @@ document.decoding_job.wait() for page in document.pages: page.get_info() - text = print_text(page.text.sexpr) + print_text(page.text.sexpr) def main(): if len(sys.argv) != 2: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/private/apt-install-build-reqs new/python-djvulibre-0.7.1/private/apt-install-build-reqs --- old/python-djvulibre-0.7/private/apt-install-build-reqs 1970-01-01 01:00:00.000000000 +0100 +++ new/python-djvulibre-0.7.1/private/apt-install-build-reqs 2016-02-20 13:37:06.000000000 +0100 @@ -0,0 +1,63 @@ +#!/bin/sh + +# Copyright © 2015-2016 Jakub Wilk <jw...@jwilk.net> +# +# This file is part of python-djvulibre. +# +# python-djvulibre is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 as published by +# the Free Software Foundation. +# +# python-djvulibre is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. + +pkgs_base=' +build-essential +libdjvulibre-dev +pkg-config +python-dev +cython +' +pkgs_tests=' +python-nose +djvulibre-bin +ghostscript +' +pkgs="$pkgs_base" + +usage() +{ + printf '%s [--tests]\n' "$0" +} + +args=$(getopt -n "$0" -o 'h' --long 'help,tests' -- "$@") +if [ $? -ne 0 ] +then + usage >&2 + exit 1 +fi +opt_tests= +eval set -- "$args" +while true +do + case "$1" in + -h|--help) usage; exit 0;; + --tests) opt_tests=y ; shift;; + --) shift; break;; + *) printf '%s: internal error (%s)\n' "$0" "$1" >&2; exit 1;; + esac +done + +[ "$opt_tests" ] && pkgs="$pkgs $pkgs_tests" + +PS4='# ' +set -e +( + set -x + # shellcheck disable=SC2086 + apt-get install $pkgs +) + +# vim:ts=4 sts=4 sw=4 et diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/private/build-and-test new/python-djvulibre-0.7.1/private/build-and-test --- old/python-djvulibre-0.7/private/build-and-test 2015-08-25 23:59:45.000000000 +0200 +++ new/python-djvulibre-0.7.1/private/build-and-test 2016-02-20 13:36:15.000000000 +0100 @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright © 2015 Jakub Wilk <jw...@jwilk.net> +# Copyright © 2015-2016 Jakub Wilk <jw...@jwilk.net> # # This file is part of python-djvulibre. # @@ -31,7 +31,7 @@ do case "$1" in -h|--help) usage; exit 0;; - -j|--jobs) opt_jobs=$2; shift 2;; + -j|--jobs) opt_jobs=$2; shift 2;; --no-build) opt_build=; shift;; --) shift; break;; *) printf '%s: internal error (%s)\n' "$0" "$1" >&2; exit 1;; @@ -42,7 +42,10 @@ [ $# = 0 ] && set -- python [ -z $opt_build ] || \ printf '%s\n' "$@" \ -| xargs -P"$opt_jobs" -t -I{python} env {python} setup.py build --build-lib build/{python} +| xargs -P"$opt_jobs" -t -I'{python}' env '{python}' setup.py build --build-lib 'build/{python}' cd tests +nosetests=$(command -v nosetests) || { echo nosetests not found >&2; exit 1; } printf '%s\n' "$@" \ -| xargs -t -I{python} env PYTHONPATH="$PWD/../build/{python}" {python} $(which nosetests) --verbose +| xargs -t -I'{python}' env PYTHONPATH="$PWD/../build/{python}" '{python}' "$nosetests" --verbose + +# vim:ts=4 sts=4 sw=4 et diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/private/mingw32-setup-env new/python-djvulibre-0.7.1/private/mingw32-setup-env --- old/python-djvulibre-0.7/private/mingw32-setup-env 2015-08-18 10:36:08.000000000 +0200 +++ new/python-djvulibre-0.7.1/private/mingw32-setup-env 2016-02-20 13:38:11.000000000 +0100 @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright © 2010-2014 Jakub Wilk <jw...@jwilk.net> +# Copyright © 2010-2016 Jakub Wilk <jw...@jwilk.net> # # This file is part of python-djvulibre. # @@ -61,7 +61,7 @@ free malloc EOF -$target-dlltool --kill-at --def msvcr.def --dllname msvcr90.dll --output-lib "$pwd/$target/common/libmsvcr.a" +"$target-dlltool" --kill-at --def msvcr.def --dllname msvcr90.dll --output-lib "$pwd/$target/common/libmsvcr.a" cd 'drive_c/Program Files/DjVuZone/DjVuLibre/' cp -v libdjvulibre.dll libjpeg.dll "$pwd/$target/common/" cp -vr include/libdjvu "$pwd/$target/common/" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/python_djvulibre.egg-info/PKG-INFO new/python-djvulibre-0.7.1/python_djvulibre.egg-info/PKG-INFO --- old/python-djvulibre-0.7/python_djvulibre.egg-info/PKG-INFO 2015-08-26 00:05:18.000000000 +0200 +++ new/python-djvulibre-0.7.1/python_djvulibre.egg-info/PKG-INFO 2016-03-11 22:34:27.000000000 +0100 @@ -1,14 +1,14 @@ Metadata-Version: 1.1 Name: python-djvulibre -Version: 0.7 +Version: 0.7.1 Summary: Python support for the DjVu image format Home-page: http://jwilk.net/software/python-djvulibre Author: Jakub Wilk Author-email: jw...@jwilk.net License: GNU GPL 2 -Description: *python-djvulibre* is a set of `Python <https://www.python.org>`_ bindings for - the `DjVuLibre <http://djvu.sf.net/>`_ library, an open source implementation - of `DjVu <http://djvu.org/>`_. +Description: *python-djvulibre* is a set of Python bindings for + the `DjVuLibre <http://djvu.sourceforge.net/>`_ library, + an open source implementation of `DjVu <http://djvu.org/>`_. Platform: all Classifier: Development Status :: 4 - Beta Classifier: Intended Audience :: Developers diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/python_djvulibre.egg-info/SOURCES.txt new/python-djvulibre-0.7.1/python_djvulibre.egg-info/SOURCES.txt --- old/python-djvulibre-0.7/python_djvulibre.egg-info/SOURCES.txt 2015-08-26 00:05:18.000000000 +0200 +++ new/python-djvulibre-0.7.1/python_djvulibre.egg-info/SOURCES.txt 2016-03-11 22:34:27.000000000 +0100 @@ -29,6 +29,7 @@ examples/djvu-crop-text examples/djvu-dump-text examples/djvu2png +private/apt-install-build-reqs private/build-and-test private/mingw32-setup-env python_djvulibre.egg-info/PKG-INFO diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/setup.py new/python-djvulibre-0.7.1/setup.py --- old/python-djvulibre-0.7/setup.py 2015-08-25 23:14:05.000000000 +0200 +++ new/python-djvulibre-0.7.1/setup.py 2015-11-23 13:38:24.000000000 +0100 @@ -14,9 +14,9 @@ # more details. ''' -*python-djvulibre* is a set of `Python <https://www.python.org>`_ bindings for -the `DjVuLibre <http://djvu.sf.net/>`_ library, an open source implementation -of `DjVu <http://djvu.org/>`_. +*python-djvulibre* is a set of Python bindings for +the `DjVuLibre <http://djvu.sourceforge.net/>`_ library, +an open source implementation of `DjVu <http://djvu.org/>`_. ''' classifiers = ''' @@ -36,7 +36,6 @@ import glob import os -import re import sys import subprocess as ipc @@ -82,11 +81,13 @@ ext_modules = list(ext_modules()) def get_version(): - if sys.version_info >= (3, 0): - extra = dict(encoding='UTF-8') - else: - extra = {} - changelog = open(os.path.join(os.path.dirname(__file__), 'doc', 'changelog'), **extra) + open_opts = {} + if str != bytes: + open_opts.update(encoding='UTF-8') + changelog = open( + os.path.join(os.path.dirname(__file__), 'doc', 'changelog'), + **open_opts + ) try: return changelog.readline().split()[1].strip('()') finally: @@ -158,10 +159,7 @@ py_version = get_version() # Work-around for <https://bugs.python.org/issue969718>: -try: - del os.environ['CFLAGS'] -except KeyError: - pass +os.environ.pop('CFLAGS', None) class build_ext(distutils.command.build_ext.build_ext): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/tests/test_decode.py new/python-djvulibre-0.7.1/tests/test_decode.py --- old/python-djvulibre-0.7/tests/test_decode.py 2015-08-18 10:36:08.000000000 +0200 +++ new/python-djvulibre-0.7.1/tests/test_decode.py 2016-02-20 13:14:01.000000000 +0100 @@ -1,6 +1,6 @@ # encoding=UTF-8 -# Copyright © 2007-2015 Jakub Wilk <jw...@jwilk.net> +# Copyright © 2007-2016 Jakub Wilk <jw...@jwilk.net> # # This file is part of python-djvulibre. # @@ -79,6 +79,7 @@ assert_is, assert_is_instance, assert_list_equal, + assert_multi_line_equal, assert_raises, assert_raises_regex, assert_raises_str, @@ -93,7 +94,6 @@ wildcard_import, # Python 2/3 compat: b, - bytes, maxsize, py3k, u, @@ -136,11 +136,11 @@ commands += '\nset-ant\n{sexpr}\n.\n'.format(sexpr=sexpr) file = tempfile.NamedTemporaryFile(prefix='test', suffix='djvu') file.seek(0) - file.write(bytes([ - 0x41, 0x54, 0x26, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x00, 0x00, 0x00, 0x22, 0x44, 0x4a, 0x56, 0x55, - 0x49, 0x4e, 0x46, 0x4f, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x01, 0x18, 0x00, 0x2c, 0x01, - 0x16, 0x01, 0x53, 0x6a, 0x62, 0x7a, 0x00, 0x00, 0x00, 0x04, 0xbc, 0x73, 0x1b, 0xd7, - ])) + file.write( + b'\x41\x54\x26\x54\x46\x4f\x52\x4d\x00\x00\x00\x22\x44\x4a\x56\x55' + b'\x49\x4e\x46\x4f\x00\x00\x00\x0a\x00\x01\x00\x01\x18\x00\x2c\x01' + b'\x16\x01\x53\x6a\x62\x7a\x00\x00\x00\x04\xbc\x73\x1b\xd7' + ) file.flush() (stdout, stderr) = run('djvused', '-s', file.name, stdin=commands.encode(locale_encoding)) assert_equal(stdout, ''.encode(locale_encoding)) @@ -428,20 +428,18 @@ assert_false(job.is_error) stdout, stderr = run('ps2ascii', tmp.name, LC_ALL='C') assert_equal(stderr, b('')) - stdout = stdout.split(b('\n')) - stdout = [b(' ').join(line.split()) for line in stdout] - assert_equal(stdout, [ - b(''), - b(''), - b('1 Lorem ipsum'), - b('Optio reprehenderit molestias amet aliquam, similique doloremque fuga labore'), - b('voluptatum voluptatem, commodi culpa voluptas, officia tenetur expedita quidem hic'), - b(''), - b('repellat molestiae quis accusamus dolores repudiandae, quidem in ad voluptas'), - b('eligendi maiores placeat ex consectetur at tenetur amet.'), - b(''), - b('1'), - ]) + stdout = stdout.decode('ASCII') + stdout = ' '.join(stdout.split()) + expected = ''' + 1 Lorem ipsum + Optio reprehenderit molestias amet aliquam, similique doloremque fuga labore + voluptatum voluptatem, commodi culpa voluptas, officia tenetur expedita quidem + hic repellat molestiae quis accusamus dolores repudiandae, quidem in ad + voluptas eligendi maiores placeat ex consectetur at tenetur amet. + 1 + ''' + expected = ' '.join(expected.split()) + assert_multi_line_equal(stdout, expected) finally: del tmp @@ -543,16 +541,16 @@ page_job.render(RENDER_COLOR, (0, 0, x, x), (0, 0, x, x), PixelFormatRgb(), 8) s = page_job.render(RENDER_COLOR, (0, 0, 10, 10), (0, 0, 4, 4), PixelFormatGrey(), 1) - assert_equal(s, bytes([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xff, 0xb8])) + assert_equal(s, b'\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xa4\xff\xff\xff\xb8') - buffer = array.array('B', bytes([0])) + buffer = array.array('B', b'\0') with assert_raises_str(ValueError, 'Image buffer is too small (16 > 1)'): page_job.render(RENDER_COLOR, (0, 0, 10, 10), (0, 0, 4, 4), PixelFormatGrey(), 1, buffer) - buffer = array.array('B', bytes([0] * 16)) + buffer = array.array('B', b'\0' * 16) assert_is(page_job.render(RENDER_COLOR, (0, 0, 10, 10), (0, 0, 4, 4), PixelFormatGrey(), 1, buffer), buffer) s = array_tobytes(buffer) - assert_equal(s, bytes([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xa4, 0xff, 0xff, 0xff, 0xb8])) + assert_equal(s, b'\xff\xff\xff\xff\xff\xff\xff\xef\xff\xff\xff\xa4\xff\xff\xff\xb8') class test_thumbnails: @@ -572,15 +570,15 @@ assert_is(pixels, None) (w, h, r), pixels = thumbnail.render((5, 5), PixelFormatGrey()) assert_equal((w, h, r), (5, 3, 5)) - assert_equal(pixels[:15], bytes([0xff, 0xeb, 0xa7, 0xf2, 0xff, 0xff, 0xbf, 0x86, 0xbe, 0xff, 0xff, 0xe7, 0xd6, 0xe7, 0xff])) - buffer = array.array('B', bytes([0])) + assert_equal(pixels[:15], b'\xff\xeb\xa7\xf2\xff\xff\xbf\x86\xbe\xff\xff\xe7\xd6\xe7\xff') + buffer = array.array('B', b'\0') with assert_raises_str(ValueError, 'Image buffer is too small (25 > 1)'): (w, h, r), pixels = thumbnail.render((5, 5), PixelFormatGrey(), buffer=buffer) - buffer = array.array('B', bytes([0] * 25)) + buffer = array.array('B', b'\0' * 25) (w, h, r), pixels = thumbnail.render((5, 5), PixelFormatGrey(), buffer=buffer) assert_is(pixels, buffer) s = array_tobytes(buffer[:15]) - assert_equal(s, bytes([0xff, 0xeb, 0xa7, 0xf2, 0xff, 0xff, 0xbf, 0x86, 0xbe, 0xff, 0xff, 0xe7, 0xd6, 0xe7, 0xff])) + assert_equal(s, b'\xff\xeb\xa7\xf2\xff\xff\xbf\x86\xbe\xff\xff\xe7\xd6\xe7\xff') def test_jobs(): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.7/tests/tools.py new/python-djvulibre-0.7.1/tests/tools.py --- old/python-djvulibre-0.7/tests/tools.py 2015-08-18 10:36:08.000000000 +0200 +++ new/python-djvulibre-0.7.1/tests/tools.py 2016-02-20 12:54:37.000000000 +0100 @@ -20,92 +20,112 @@ import re import sys +from nose import SkipTest + +import nose.tools + from nose.tools import ( assert_true, assert_false, assert_equal, assert_not_equal, ) -from nose import SkipTest -if sys.version_info >= (2, 7): - from nose.tools import ( - assert_in, - assert_is, - assert_is_instance, - assert_less, - assert_list_equal, - assert_multi_line_equal, - assert_not_in, - assert_raises, +def noseimport(vmaj, vmin, name=None): + def wrapper(f): + if f.__module__ == 'unittest.case': + return f + if sys.version_info >= (vmaj, vmin): + return getattr(nose.tools, name or f.__name__) + return f + return wrapper + +@noseimport(2, 7) +def assert_in(x, y): + assert_true( + x in y, + msg='{0!r} not found in {1!r}'.format(x, y) + ) + +@noseimport(2, 7) +def assert_is(x, y): + assert_true( + x is y, + msg='{0!r} is not {1!r}'.format(x, y) ) - if sys.version_info >= (3, 2): - from nose.tools import assert_raises_regex - from nose.tools import assert_regex - else: - from nose.tools import assert_raises_regexp as assert_raises_regex - from nose.tools import assert_regexp_matches as assert_regex + +@noseimport(2, 7) +def assert_is_instance(obj, cls): + assert_true( + isinstance(obj, cls), + msg='{0!r} is not an instance of {1!r}'.format(obj, cls) + ) + +@noseimport(2, 7) +def assert_less(x, y): + assert_true( + x < y, + msg='{0!r} not less than {1!r}'.format(x, y) + ) + +@noseimport(2, 7) +def assert_list_equal(x, y): + assert_is_instance(x, list) + assert_is_instance(y, list) + return assert_equal(x, y) + +@noseimport(2, 7) +def assert_multi_line_equal(x, y): + return assert_equal(x, y) +if sys.version_info >= (2, 7): type(assert_multi_line_equal.__self__).maxDiff = None -else: - def assert_in(x, y): - assert_true( - x in y, - msg='{0!r} not found in {1!r}'.format(x, y) - ) - def assert_is(x, y): - assert_true( - x is y, - msg='{0!r} is not {1!r}'.format(x, y) - ) - def assert_is_instance(obj, cls): - assert_true( - isinstance(obj, cls), - msg='{0!r} is not an instance of {1!r}'.format(obj, cls) - ) - def assert_less(x, y): - assert_true( - x < y, - msg='{0!r} not less than {1!r}'.format(x, y) - ) - assert_list_equal = assert_equal - assert_multi_line_equal = assert_equal - def assert_not_in(x, y): - assert_true( - x not in y, - msg='{0!r} unexpectedly found in {1!r}'.format(x, y) - ) - class assert_raises(object): - def __init__(self, exc_type): - self._exc_type = exc_type - self.exception = None - def __enter__(self): - return self - def __exit__(self, exc_type, exc_value, tb): - if exc_type is None: - assert_true(False, '{0} not raised'.format(self._exc_type.__name__)) - if not issubclass(exc_type, self._exc_type): - return False - if isinstance(exc_value, exc_type): - pass - # This branch is not always taken in Python 2.6: - # https://bugs.python.org/issue7853 - elif isinstance(exc_value, tuple): - exc_value = exc_type(*exc_value) - else: - exc_value = exc_type(exc_value) - self.exception = exc_value - return True - @contextlib.contextmanager - def assert_raises_regex(exc_type, regex): - with assert_raises(exc_type) as ecm: - yield - assert_regex(str(ecm.exception), regex) - def assert_regex(text, regex): - if isinstance(regex, basestring): - regex = re.compile(regex) - if not regex.search(text): - message = "Regex didn't match: {0!r} not found in {1!r}".format(regex.pattern, text) - assert_true(False, msg=message) + +@noseimport(2, 7) +def assert_not_in(x, y): + assert_true( + x not in y, + msg='{0!r} unexpectedly found in {1!r}'.format(x, y) + ) + +@noseimport(2, 7) +class assert_raises(object): + def __init__(self, exc_type): + self._exc_type = exc_type + self.exception = None + def __enter__(self): + return self + def __exit__(self, exc_type, exc_value, tb): + if exc_type is None: + assert_true(False, '{0} not raised'.format(self._exc_type.__name__)) + if not issubclass(exc_type, self._exc_type): + return False + if isinstance(exc_value, exc_type): + pass + # This branch is not always taken in Python 2.6: + # https://bugs.python.org/issue7853 + elif isinstance(exc_value, tuple): + exc_value = exc_type(*exc_value) + else: + exc_value = exc_type(exc_value) + self.exception = exc_value + return True + +@noseimport(2, 7, 'assert_raises_regexp') +@noseimport(3, 2) +@contextlib.contextmanager +def assert_raises_regex(exc_type, regex): + with assert_raises(exc_type) as ecm: + yield + assert_regex(str(ecm.exception), regex) + +@noseimport(2, 7, 'assert_regexp_matches') +@noseimport(3, 2) +def assert_regex(text, regex): + if isinstance(regex, basestring): + regex = re.compile(regex) + if not regex.search(text): + message = "Regex didn't match: {0!r} not found in {1!r}".format(regex.pattern, text) + assert_true(False, msg=message) @contextlib.contextmanager def assert_raises_str(exc_type, s): @@ -152,17 +172,11 @@ return -1 if x > y: return 1 - assert 0 + assert False else: cmp = cmp if py3k: - bytes = bytes -else: - def bytes(iterable): - return ''.join(chr(c) for c in iterable) - -if py3k: from io import StringIO else: from io import BytesIO as StringIO @@ -244,7 +258,6 @@ # Python 2/3 compat: 'StringIO', 'b', - 'blob', 'cmp', 'long', 'maxsize', ++++++ python-djvulibre.keyring ++++++ --- /var/tmp/diff_new_pack.BCdLUW/_old 2016-03-26 18:12:34.000000000 +0100 +++ /var/tmp/diff_new_pack.BCdLUW/_new 2016-03-26 18:12:34.000000000 +0100 @@ -1,7 +1,8 @@ -pub rsa4096/015475F5 2009-10-23 [expires: 2016-01-01] -uid [ unknown] Jakub Wilk <jw...@jwilk.net> -uid [ unknown] Jakub Wilk <jw...@debian.org> -uid [ unknown] Jakub Wilk <uba...@users.sf.net> +pub rsa4096/015475F5 2009-10-23 [expires: 2017-01-01] +uid [ unknown] Jakub Wilk <jw...@jwilk.net> +uid [ unknown] Jakub Wilk <jw...@debian.org> +uid [ unknown] Jakub Wilk <uba...@users.sf.net> +uid [ unknown] [jpeg image of size 6044] sub rsa4096/E5874F63 2009-10-23 -----BEGIN PGP PUBLIC KEY BLOCK----- @@ -17,66 +18,66 @@ 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 -bN5AxyPui0i3KQXs09FW/+n9DTw= -=iNj8 +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 +I+6LSLcpBezT0Vb/6f0NPA== +=l89W -----END PGP PUBLIC KEY BLOCK-----