Hello community,
here is the log from the commit of package python-djvulibre for openSUSE:Factory checked in at 2014-11-26 10:33:07
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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 2013-10-25 11:14:26.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.python-djvulibre.new/python-djvulibre.changes 2014-11-26 10:33:10.000000000 +0100
@@ -1,0 +2,26 @@
+Sun Nov 16 15:59:43 UTC 2014 - lazy.kent@opensuse.org
+
+- Add runtime dependency: djvulibre.
+
+-------------------------------------------------------------------
+Thu Nov 13 13:47:47 UTC 2014 - lazy.kent@opensuse.org
+
+- Update to 0.3.10.
+ * Improve error handling in examples.
+ * Improve the test suite:
+ + When running external programs, don't reset environment
+ completely, but only set LC_ALL=C.
+ + Skip more tests (instead of making them fail) when they are
+ run in an unsuitable environment.
+ + Correctly detect ASCII locale encoding on FreeBSD (and
+ possibly other non-GNU systems).
+ + Don't hard-code libc error messages.
+ + Fix test_bad_io failures with Cython ≥ 0.21.
+ * Improve setup.py:
+ + Make it possible to build the package natively on Windows.
+ * Use HTTPS URLs when they are available, in documentation and
+ code.
+- Run tests. BuildRequires: djvulibre, python-nose.
+- Add the source GPG signature and a keyring.
+
+-------------------------------------------------------------------
Old:
----
python-djvulibre-0.3.9.tar.gz
New:
----
python-djvulibre-0.3.10.tar.gz
python-djvulibre-0.3.10.tar.gz.asc
python-djvulibre.keyring
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-djvulibre.spec ++++++
--- /var/tmp/diff_new_pack.v4thA7/_old 2014-11-26 10:33:11.000000000 +0100
+++ /var/tmp/diff_new_pack.v4thA7/_new 2014-11-26 10:33:11.000000000 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-djvulibre
#
-# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2014 SUSE LINUX Products 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,24 +17,28 @@
Name: python-djvulibre
-Version: 0.3.9
+Version: 0.3.10
Release: 0
Summary: Python Support for the DjVu Image Format
License: GPL-2.0
Group: Development/Libraries/Python
Url: http://jwilk.net/software/python-djvulibre
-Source0: http://pypi.python.org/packages/source/p/%{name}/%{name}-%{version}.tar.gz
+Source0: http://pypi.python.org/packages/source/p/python-djvulibre/%{name}-%{version}.tar.gz
+Source1: http://pypi.python.org/packages/source/p/python-djvulibre/%{name}-%{version}.tar.gz.asc
+Source2: %{name}.keyring
BuildRequires: graphviz
BuildRequires: graphviz-gnome
BuildRequires: pkg-config
BuildRequires: python-Cython
+BuildRequires: python-Sphinx
BuildRequires: python-devel
BuildRequires: python-setuptools
-# Starting openSUSE 12.1 the package name is python-Sphinx.
-BuildRequires: python-sphinx
BuildRequires: pkgconfig(ddjvuapi)
+# Required for tests.
+BuildRequires: djvulibre
+BuildRequires: python-nose
+Requires: djvulibre
BuildRoot: %{_tmppath}/%{name}-%{version}-build
-%py_requires
%description
python-djvulibre is a set of Python bindings for the DjVuLibre library,
@@ -63,23 +67,28 @@
%install
python setup.py install \
--root=%{buildroot} \
- --prefix=%{_prefix} \
- --record-rpm=INSTALLED_FILES
-install -dm 0755 %{buildroot}%{_defaultdocdir}/%{name}-doc/_images
-install -dm 0755 %{buildroot}%{_defaultdocdir}/%{name}-doc/_static
+ --prefix=%{_prefix}
+install -dm 0755 %{buildroot}%{_defaultdocdir}/%{name}-doc/_images/
+install -dm 0755 %{buildroot}%{_defaultdocdir}/%{name}-doc/_static/
install -m 0644 build/sphinx/html/{*.html,*.js} \
- %{buildroot}%{_defaultdocdir}/%{name}-doc
+ %{buildroot}%{_defaultdocdir}/%{name}-doc/
install -m 0644 build/sphinx/html/_images/* \
- %{buildroot}%{_defaultdocdir}/%{name}-doc/_images
+ %{buildroot}%{_defaultdocdir}/%{name}-doc/_images/
install -m 0644 build/sphinx/html/_static/* \
- %{buildroot}%{_defaultdocdir}/%{name}-doc/_static
+ %{buildroot}%{_defaultdocdir}/%{name}-doc/_static/
-%files -f INSTALLED_FILES
+%check
+cd tests/
+ln -sf %{buildroot}%{python_sitearch}/djvu/ djvu
+python -m nose --verbose --no-skip
+
+%files
%defattr(-,root,root,-)
-%doc COPYING doc/changelog examples
+%doc COPYING doc/changelog examples/
+%{python_sitearch}/*
%files doc
%defattr(-,root,root,-)
-%doc %{_defaultdocdir}/%{name}-doc
+%doc %{_defaultdocdir}/%{name}-doc/
%changelog
++++++ python-djvulibre-0.3.9.tar.gz -> python-djvulibre-0.3.10.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.3.9/COPYING new/python-djvulibre-0.3.10/COPYING
--- old/python-djvulibre-0.3.9/COPYING 2009-06-04 16:55:28.000000000 +0200
+++ new/python-djvulibre-0.3.10/COPYING 2012-08-07 12:29:43.000000000 +0200
@@ -1,12 +1,12 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
- Preamble
+ Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
@@ -56,7 +56,7 @@
The precise terms and conditions for copying, distribution and
modification follow.
- GNU GENERAL PUBLIC LICENSE
+ GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
@@ -255,7 +255,7 @@
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
- NO WARRANTY
+ NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
@@ -277,9 +277,9 @@
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
- END OF TERMS AND CONDITIONS
+ END OF TERMS AND CONDITIONS
- How to Apply These Terms to Your New Programs
+ How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.3.9/PKG-INFO new/python-djvulibre-0.3.10/PKG-INFO
--- old/python-djvulibre-0.3.9/PKG-INFO 2012-03-19 21:02:31.000000000 +0100
+++ new/python-djvulibre-0.3.10/PKG-INFO 2014-11-04 11:48:02.000000000 +0100
@@ -1,14 +1,14 @@
Metadata-Version: 1.1
Name: python-djvulibre
-Version: 0.3.9
+Version: 0.3.10
Summary: Python support for the DjVu image format
Home-page: http://jwilk.net/software/python-djvulibre
Author: Jakub Wilk
Author-email: jwilk@jwilk.net
License: GNU GPL 2
-Description: *python-djvulibre* is a set of `Python http://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 https://www.python.org`_ bindings for
+ the `DjVuLibre http://djvu.sf.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.3.9/djvu/decode.pyx new/python-djvulibre-0.3.10/djvu/decode.pyx
--- old/python-djvulibre-0.3.9/djvu/decode.pyx 2012-03-18 23:18:33.000000000 +0100
+++ new/python-djvulibre-0.3.10/djvu/decode.pyx 2014-11-02 17:39:42.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright © 2007-2012 Jakub Wilk
+# Copyright © 2007-2014 Jakub Wilk
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -57,7 +57,7 @@
from traceback import format_exc
# The two lines below are solely to work-around Cython bug:
-# http://bugs.debian.org/620859
+# https://bugs.debian.org/620859
cdef object MemoryError
IF PY3K:
from builtins import MemoryError
@@ -298,7 +298,7 @@
Exception.__init__(
self,
'A DjVuLibre bug has been encountered.\n'
- 'See http://bugs.debian.org/%d for details.\n'
+ 'See https://bugs.debian.org/%d for details.\n'
'Please upgrade your DjVuLibre.' % (debian_bug_no,)
)
@@ -1095,7 +1095,7 @@
.. warning::
Due to a DjVuLibre (<= 3.5.20) bug, this method may be broken.
- See http://bugs.debian.org/467282 for details.
+ See https://bugs.debian.org/467282 for details.
'''
cdef char * optv[2]
cdef int optc
@@ -1251,7 +1251,7 @@
**Warning***
------------
Due to a DjVuLibre (<= 3.5.20) bug, this method may be broken.
- See http://bugs.debian.org/469122 for details.
+ See https://bugs.debian.org/469122 for details.
'''
cdef FILE* output
cdef SaveJob job
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.3.9/djvu/sexpr.pyx new/python-djvulibre-0.3.10/djvu/sexpr.pyx
--- old/python-djvulibre-0.3.9/djvu/sexpr.pyx 2012-03-19 14:30:42.000000000 +0100
+++ new/python-djvulibre-0.3.10/djvu/sexpr.pyx 2014-11-02 17:39:47.000000000 +0100
@@ -1,4 +1,4 @@
-# Copyright © 2007-2012 Jakub Wilk
+# Copyright © 2007-2014 Jakub Wilk
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -798,7 +798,7 @@
# Normally one would use
# self[len(self):] = …
# but Cython (at least 0.13) generates broken code for such a statement.
- # http://bugs.debian.org/604963
+ # https://bugs.debian.org/604963
iter(iterable)
self[slice(len(self), None, None)] = iterable
@@ -806,7 +806,7 @@
# Normally one would use
# self[len(self):] = …
# but Cython (at least 0.13) generates broken code for such a statement.
- # http://bugs.debian.org/604963
+ # https://bugs.debian.org/604963
iter(iterable)
self[slice(len(self), None, None)] = iterable
return self
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.3.9/doc/changelog new/python-djvulibre-0.3.10/doc/changelog
--- old/python-djvulibre-0.3.9/doc/changelog 2012-03-19 20:41:55.000000000 +0100
+++ new/python-djvulibre-0.3.10/doc/changelog 2014-11-04 11:44:13.000000000 +0100
@@ -1,14 +1,33 @@
+python-djvulibre (0.3.10) unstable; urgency=low
+
+ * Improve error handling in examples.
+ * Improve the test suite:
+ + When running external programs, don't reset environment completely, but
+ only set LC_ALL=C.
+ + Skip more tests (instead of making them fail) when they are run in
+ an unsuitable environment.
+ + Correctly detect ASCII locale encoding on FreeBSD (and possibly other
+ non-GNU systems).
+ + Don't hard-code libc error messages.
+ + Fix test_bad_io failures with Cython ≥ 0.21.
+ * Improve setup.py:
+ + Make it possible to build the package natively on Windows.
+ https://bitbucket.org/jwilk/python-djvulibre/issue/1
+ * Use HTTPS URLs when they are available, in documentation and code.
+
+ -- Jakub Wilk Tue, 04 Nov 2014 11:44:09 +0100
+
python-djvulibre (0.3.9) unstable; urgency=low
* Ensure that all S-expression output is 7-bit.
- This is work-around for http://bugs.debian.org/664626.
+ This is work-around for https://bugs.debian.org/664626.
-- Jakub Wilk Mon, 19 Mar 2012 20:41:53 +0100
python-djvulibre (0.3.8) unstable; urgency=low
* Ensure that S-expression input/output functions are always initialized.
- This is work-around for http://bugs.debian.org/664442.
+ This is work-around for https://bugs.debian.org/664442.
-- Jakub Wilk Sun, 18 Mar 2012 23:44:55 +0100
@@ -49,10 +68,10 @@
* Optimize DocumentPages.__len__() and DocumentFiles.__len__().
* Fix compatibility with Python 3.X (broken in 0.3.3).
* Update various external documentation URLs.
- http://bugs.debian.org/627290
+ https://bugs.debian.org/627290
* Improve test suite:
+ Normalize whitespace in ps2ascii output.
- http://bugs.debian.org/646177
+ https://bugs.debian.org/646177
* Improve setup.py:
+ Print a more meaningful error message if pkg-config fails.
+ build_sphinx is now available even without setuptools.
@@ -67,7 +86,7 @@
* Add Windows-specific module djvu.dllpath, which is aimed to ease finding
DjVuLibre DLLs in non-standard locations.
* Make expression and symbol objects picklable.
- * Add work-around for http://bugs.debian.org/620859.
+ * Add work-around for https://bugs.debian.org/620859.
* Fix test suite compatibility with Python 3.
-- Jakub Wilk Mon, 04 Apr 2011 21:06:01 +0200
@@ -81,9 +100,9 @@
* Add ‘+=’ and ‘del’ operators for list expressions.
* Fix compatibility with Cython 0.12.
* Fix compatibility with some non-POSIX operating systems.
- * Add work-around for http://bugs.python.org/issue969718.
+ * Add work-around for https://bugs.python.org/issue969718.
* Improve setup.py:
- + Add work-around for http://bugs.debian.org/607112.
+ + Add work-around for https://bugs.debian.org/607112.
+ Make ‘clean --all’ remove temporary *.pxi and *.c files.
+ Don't import Cython modules; calls the ‘cython’ binary instead.
+ Allow cross-compilation using MinGW cross compiler.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.3.9/doc/source/conf.py new/python-djvulibre-0.3.10/doc/source/conf.py
--- old/python-djvulibre-0.3.9/doc/source/conf.py 2012-03-18 23:28:16.000000000 +0100
+++ new/python-djvulibre-0.3.10/doc/source/conf.py 2014-05-12 12:37:54.000000000 +0200
@@ -38,7 +38,7 @@
html_use_modindex = True
html_use_index = False
-intersphinx_mapping = {'http://docs.python.org/': None}
+intersphinx_mapping = {'https://docs.python.org/': None}
rst_epilog = '''
.. |djvu3ref| replace:: Lizardtech DjVu Reference
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.3.9/doc/source/documents.txt new/python-djvulibre-0.3.10/doc/source/documents.txt
--- old/python-djvulibre-0.3.9/doc/source/documents.txt 2010-09-05 18:39:53.000000000 +0200
+++ new/python-djvulibre-0.3.10/doc/source/documents.txt 2014-05-12 12:36:27.000000000 +0200
@@ -88,7 +88,7 @@
.. warning::
Due to a DjVuLibre (≤ 3.5.20) bug, this method may be broken.
- See http://bugs.debian.org/467282 for details.
+ See https://bugs.debian.org/467282 for details.
.. method:: export_ps(file[, …][, wait=True])
@@ -211,7 +211,7 @@
.. warning::
Due to a DjVuLibre (≤ 3.5.20) bug, this method may be broken.
- See http://bugs.debian.org/469122 for details.
+ See https://bugs.debian.org/469122 for details.
.. currentmodule:: djvu.decode
.. class:: SaveJob
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.3.9/examples/djvu-crop-text new/python-djvulibre-0.3.10/examples/djvu-crop-text
--- old/python-djvulibre-0.3.9/examples/djvu-crop-text 2012-03-18 23:22:19.000000000 +0100
+++ new/python-djvulibre-0.3.10/examples/djvu-crop-text 2013-11-23 17:23:42.000000000 +0100
@@ -1,7 +1,7 @@
#!/usr/bin/python
# encoding=UTF-8
-# Copyright © 2008-2010 Jakub Wilk
+# Copyright © 2008-2013 Jakub Wilk
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -13,8 +13,9 @@
# General Public License for more details.
import argparse
-import sys
+import os
import subprocess
+import sys
import djvu.sexpr
import djvu.decode
@@ -68,7 +69,9 @@
def handle_message(self, message):
if isinstance(message, djvu.decode.ErrorMessage):
print >>sys.stderr, message
- sys.exit(1)
+ # Exceptions in handle_message() are ignored, so sys.exit()
+ # wouldn't work here.
+ os._exit(1)
def process_page(self, page):
print >>sys.stderr, '- Page #%d' % (page.n + 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.3.9/examples/djvu-dump-text new/python-djvulibre-0.3.10/examples/djvu-dump-text
--- old/python-djvulibre-0.3.9/examples/djvu-dump-text 2012-03-18 23:22:59.000000000 +0100
+++ new/python-djvulibre-0.3.10/examples/djvu-dump-text 2013-11-23 17:23:42.000000000 +0100
@@ -1,7 +1,7 @@
#!/usr/bin/python
# encoding=UTF-8
-# Copyright © 2008-2010 Jakub Wilk
+# Copyright © 2008-2013 Jakub Wilk
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -13,12 +13,16 @@
# General Public License for more details.
import sys
+import os
+
import djvu.decode
def print_text(sexpr, level=0):
if level > 0:
print ' ' * (2 * level - 1),
if isinstance(sexpr, djvu.sexpr.ListExpression):
+ if len(sexpr) == 0:
+ return
print str(sexpr[0].value), [sexpr[i].value for i in xrange(1, 5)]
for child in sexpr[5:]:
print_text(child, level + 1)
@@ -30,7 +34,9 @@
def handle_message(self, message):
if isinstance(message, djvu.decode.ErrorMessage):
print >>sys.stderr, message
- sys.exit(1)
+ # Exceptions in handle_message() are ignored, so sys.exit()
+ # wouldn't work here.
+ os._exit(1)
def process(self, path):
document = self.new_document(djvu.decode.FileURI(path))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.3.9/examples/djvu2png new/python-djvulibre-0.3.10/examples/djvu2png
--- old/python-djvulibre-0.3.9/examples/djvu2png 2012-03-18 23:25:09.000000000 +0100
+++ new/python-djvulibre-0.3.10/examples/djvu2png 2013-11-23 17:23:42.000000000 +0100
@@ -1,7 +1,7 @@
#!/usr/bin/python
# encoding=UTF-8
-# Copyright © 2010 Jakub Wilk
+# Copyright © 2010-2013 Jakub Wilk
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -13,6 +13,7 @@
# General Public License for more details.
import argparse
+import os
import sys
import cairo
@@ -29,7 +30,9 @@
def handle_message(self, message):
if isinstance(message, djvu.decode.ErrorMessage):
print >>sys.stderr, message
- sys.exit(1)
+ # Exceptions in handle_message() are ignored, so sys.exit()
+ # wouldn't work here.
+ os._exit(1)
def process(self, djvu_path, png_path, mode):
document = self.new_document(djvu.decode.FileURI(djvu_path))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.3.9/python_djvulibre.egg-info/PKG-INFO new/python-djvulibre-0.3.10/python_djvulibre.egg-info/PKG-INFO
--- old/python-djvulibre-0.3.9/python_djvulibre.egg-info/PKG-INFO 2012-03-19 21:02:31.000000000 +0100
+++ new/python-djvulibre-0.3.10/python_djvulibre.egg-info/PKG-INFO 2014-11-04 11:48:02.000000000 +0100
@@ -1,14 +1,14 @@
Metadata-Version: 1.1
Name: python-djvulibre
-Version: 0.3.9
+Version: 0.3.10
Summary: Python support for the DjVu image format
Home-page: http://jwilk.net/software/python-djvulibre
Author: Jakub Wilk
Author-email: jwilk@jwilk.net
License: GNU GPL 2
-Description: *python-djvulibre* is a set of `Python http://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 https://www.python.org`_ bindings for
+ the `DjVuLibre http://djvu.sf.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.3.9/setup.py new/python-djvulibre-0.3.10/setup.py
--- old/python-djvulibre-0.3.9/setup.py 2012-03-18 23:27:27.000000000 +0100
+++ new/python-djvulibre-0.3.10/setup.py 2014-11-04 11:10:05.000000000 +0100
@@ -1,6 +1,6 @@
# encoding=UTF-8
-# Copyright © 2007-2011 Jakub Wilk
+# Copyright © 2007-2014 Jakub Wilk
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -12,9 +12,9 @@
# General Public License for more details.
'''
-*python-djvulibre* is a set of `Python http://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 https://www.python.org`_ bindings for
+the `DjVuLibre http://djvu.sf.net/`_ library, an open source implementation
+of `DjVu http://djvu.org/`_.
'''
classifiers = '''
@@ -30,10 +30,11 @@
Topic :: Multimedia :: Graphics
Topic :: Multimedia :: Graphics :: Graphics Conversion
Topic :: Text Processing
-'''.strip().split('\n')
+'''.strip().splitlines()
import glob
import os
+import re
import sys
import subprocess as ipc
@@ -42,6 +43,9 @@
else:
mingw32cross = None
+if os.name == 'nt':
+ import djvu.dllpath
+
# Just to make sure setuptools won't try to be clever:
fake_module = type(sys)('fake_module')
fake_module.build_ext = None
@@ -66,7 +70,7 @@
sphinx_setup_command = None
def ext_modules():
- for pyx_file in glob.glob(os.path.join('djvu', '*.pyx')):
+ for pyx_file in glob.iglob(os.path.join('djvu', '*.pyx')):
module, _ = os.path.splitext(os.path.basename(pyx_file))
yield module
ext_modules = list(ext_modules())
@@ -85,6 +89,16 @@
PKG_CONFIG_FLAG_MAP = {'-I': 'include_dirs', '-L': 'library_dirs', '-l': 'libraries'}
def pkg_config(*packages, **kwargs):
+ fallback = dict(
+ libraries=['djvulibre'],
+ )
+ if os.name == 'nt':
+ dll_path = djvu.dllpath.guess_dll_path()
+ if dll_path is not None:
+ fallback.update(
+ extra_compile_args=['-I' + os.path.join(dll_path, 'include')],
+ extra_link_args=['-L' + os.path.join(dll_path)],
+ )
try:
pkgconfig = ipc.Popen(
['pkg-config', '--libs', '--cflags'] + list(packages),
@@ -92,13 +106,14 @@
)
except OSError:
_, ex, _ = sys.exc_info()
- ex.strerror = 'pkg-config: ' + ex.strerror
- raise
+ distutils.log.warn('cannot execute pkg-config: ' + str(ex))
+ return fallback
stdout, stderr = pkgconfig.communicate()
stdout = stdout.decode('ASCII', 'replace')
stderr = stderr.decode('ASCII', 'replace')
if pkgconfig.returncode:
- raise IOError('[pkg-config] ' + stderr.strip())
+ distutils.log.warn('pkg-config failed: ' + stderr.strip())
+ return fallback
kwargs.setdefault('extra_link_args', [])
kwargs.setdefault('extra_compile_args', ['-Wno-uninitialized'])
for argument in stdout.split():
@@ -111,17 +126,9 @@
kwargs['extra_compile_args'].append(argument)
return kwargs
-if mingw32cross:
-
- def pkg_config(*packages, **kwargs):
- return dict(
- libraries=['libdjvulibre'],
- )
- return kwargs
-
__version__ = get_version()
-# Work-around for http://bugs.python.org/issue969718:
+# Work-around for https://bugs.python.org/issue969718:
try:
del os.environ['CFLAGS']
except KeyError:
@@ -164,25 +171,33 @@
distutils.log.info('cythoning %r extension', ext.name)
def build_c(source, target):
distutils.spawn.spawn(['cython', source])
- # XXX This is needed to work around http://bugs.debian.org/607112.
+ # XXX This is needed to work around https://bugs.debian.org/607112.
# Fortunately, python-djvulibre doesn't really need __Pyx_GetVtable().
- distutils.spawn.spawn(['sed', '-i~', '-e',
- r's/\(static int __Pyx_GetVtable(PyObject [*]dict, void [*]vtabptr) {\)/\1 return 0;/',
- target
- ])
+ file = open(target, 'r+')
+ try:
+ contents = file.read()
+ contents = re.compile(
+ r'(?<=^static int __Pyx_GetVtable\(PyObject [*]dict, void [*]vtabptr\) {)$',
+ re.MULTILINE
+ ).sub(' return 0;', contents)
+ file.seek(0)
+ file.truncate()
+ file.write(contents)
+ finally:
+ file.close()
self.make_file(depends, target, build_c, [source, target])
class clean(distutils.command.clean.clean):
def run(self):
if self.all:
- for wildcard in 'djvu/*.c', 'djvu/*.c~', 'djvu/config.pxi':
+ for wildcard in 'djvu/*.c', 'djvu/config.pxi':
filenames = glob.glob(wildcard)
if filenames:
distutils.log.info('removing %r', wildcard)
if self.dry_run:
continue
- for filename in glob.glob(wildcard):
+ for filename in filenames:
os.remove(filename)
return distutils.command.clean.clean.run(self)
@@ -198,12 +213,15 @@
# use instead.
build_ext = self.get_finalized_command('build_ext')
sys.path[:0] = [build_ext.build_lib]
- import djvu
+ for ext in ext_modules:
+ __import__('djvu.' + ext)
del sys.path[0]
sphinx_setup_command.BuildDoc.run(self)
else:
build_sphinx = None
+compiler_flags = pkg_config('ddjvuapi')
+
setup_params = dict(
name = 'python-djvulibre',
version = __version__,
@@ -220,7 +238,7 @@
distutils.command.build_ext.Extension(
'djvu.%s' % name, ['djvu/%s.pyx' % name],
depends = ['djvu/common.pxi'] + glob.glob('djvu/*.pxd'),
- **pkg_config('ddjvuapi')
+ **compiler_flags
)
for name in ext_modules
],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.3.9/tests/common.py new/python-djvulibre-0.3.10/tests/common.py
--- old/python-djvulibre-0.3.9/tests/common.py 2012-03-19 20:38:40.000000000 +0100
+++ new/python-djvulibre-0.3.10/tests/common.py 2013-06-11 22:44:35.000000000 +0200
@@ -13,6 +13,7 @@
from __future__ import with_statement
+import codecs
import contextlib
import locale
import os
@@ -41,7 +42,7 @@
locale.LC_MESSAGES = locale.LC_ALL
locale_encoding = locale.getpreferredencoding()
-if locale_encoding == 'ANSI_X3.4-1968':
+if codecs.lookup(locale_encoding) == codecs.lookup('US-ASCII'):
locale_encoding = 'UTF-8'
py3k = sys.version_info >= (3, 0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.3.9/tests/test_decode.py new/python-djvulibre-0.3.10/tests/test_decode.py
--- old/python-djvulibre-0.3.9/tests/test_decode.py 2012-03-19 15:27:22.000000000 +0100
+++ new/python-djvulibre-0.3.10/tests/test_decode.py 2013-06-13 15:07:11.000000000 +0200
@@ -1,6 +1,6 @@
# encoding=UTF-8
-# Copyright © 2007-2012 Jakub Wilk
+# Copyright © 2007-2013 Jakub Wilk
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -14,6 +14,7 @@
from __future__ import with_statement
import array
+import errno
import os
import shutil
import subprocess as ipc
@@ -68,29 +69,53 @@
Document()
def test_nonexistent(self):
+ path = '__nonexistent__'
+ try:
+ os.stat(path)
+ except OSError:
+ _, ex, _ = sys.exc_info()
+ c_message = ex.args[1]
+ else:
+ raise OSError(errno.EEXIST, os.strerror(errno.EEXIST), path)
+ c_message.encode('ASCII')
skip_unless_c_messages()
context = Context()
with raises(JobFailed):
- document = context.new_document(FileUri('__nonexistent__'))
+ document = context.new_document(FileUri(path))
message = context.get_message()
assert_equal(type(message), ErrorMessage)
assert_equal(type(message.message), unicode)
- assert_equal(message.message, "[1-11711] Failed to open '__nonexistent__': No such file or directory.")
+ assert_equal(message.message, "[1-11711] Failed to open '%s': %s." % (path, c_message))
assert_equal(str(message), message.message)
assert_equal(unicode(message), message.message)
def test_nonexistent_ja(self):
skip_unless_c_messages()
skip_unless_translation_exists('ja_JP.UTF-8')
+ path = '__nonexistent__'
context = Context()
+ try:
+ with amended_locale(LC_ALL='ja_JP.UTF-8'):
+ os.stat(path)
+ except OSError:
+ _, ex, _ = sys.exc_info()
+ c_message = ex.args[1]
+ else:
+ raise OSError(errno.EEXIST, os.strerror(errno.EEXIST), path)
+ try:
+ c_message.encode('ASCII')
+ except UnicodeError:
+ pass
+ else:
+ raise AssertionError('ja_JP error message is ASCII-only: %r' % c_message)
with amended_locale(LC_ALL='ja_JP.UTF-8'):
with raises(JobFailed):
- document = context.new_document(FileUri('__nonexistent__'))
+ document = context.new_document(FileUri(path))
message = context.get_message()
assert_equal(type(message), ErrorMessage)
assert_equal(type(message.message), unicode)
- assert_equal(message.message, u("[1-11711] Failed to open '__nonexistent__': そのようなファイルやディレクトリはありません."))
- assert_equal(str(message), "[1-11711] Failed to open '__nonexistent__': そのようなファイルやディレクトリはありません.")
+ assert_equal(message.message, u("[1-11711] Failed to open '%s': %s." % (path, c_message)))
+ assert_equal(str(message), "[1-11711] Failed to open '%s': %s." % (path, c_message))
assert_equal(unicode(message), message.message)
def test_new_document(self):
@@ -194,7 +219,9 @@
assert_equal(len(document.pages), 6)
assert_equal(len(document.files), 7)
- stdout0, stderr0 = ipc.Popen(['djvudump', original_filename], stdout=ipc.PIPE, stderr=ipc.PIPE, env={}).communicate()
+ c_env = dict(os.environ, LC_ALL='C')
+
+ stdout0, stderr0 = ipc.Popen(['djvudump', original_filename], stdout=ipc.PIPE, stderr=ipc.PIPE, env=c_env).communicate()
assert_equal(stderr0, b(''))
stdout0 = stdout0.replace(b('\r\n'), b('\n'))
@@ -206,7 +233,7 @@
assert_true(job.is_done)
assert_false(job.is_error)
tmp.close()
- stdout, stderr = ipc.Popen(['djvudump', tmp.name], stdout=ipc.PIPE, stderr=ipc.PIPE, env={}).communicate()
+ stdout, stderr = ipc.Popen(['djvudump', tmp.name], stdout=ipc.PIPE, stderr=ipc.PIPE, env=c_env).communicate()
assert_equal(stderr, b(''))
stdout = stdout.replace(b('\r\n'), b('\n'))
assert_equal(stdout, stdout0)
@@ -222,7 +249,7 @@
assert_true(job.is_done)
assert_false(job.is_error)
tmp.close()
- stdout, stderr = ipc.Popen(['djvudump', tmp.name], stdout=ipc.PIPE, stderr=ipc.PIPE, env={}).communicate()
+ stdout, stderr = ipc.Popen(['djvudump', tmp.name], stdout=ipc.PIPE, stderr=ipc.PIPE, env=c_env).communicate()
assert_equal(stderr, b(''))
stdout = stdout.replace(b('\r\n'), b('\n'))
stdout0 = stdout0.split(b('\n'))
@@ -242,7 +269,7 @@
assert_equal(type(job), SaveJob)
assert_true(job.is_done)
assert_false(job.is_error)
- stdout, stderr = ipc.Popen(['djvudump', tmpfname], stdout=ipc.PIPE, stderr=ipc.PIPE, env={}).communicate()
+ stdout, stderr = ipc.Popen(['djvudump', tmpfname], stdout=ipc.PIPE, stderr=ipc.PIPE, env=c_env).communicate()
assert_equal(stderr, b(''))
stdout = stdout.replace(b('\r\n'), b('\n'))
stdout = stdout.split(b('\n'))
@@ -263,7 +290,7 @@
assert_equal(type(job), SaveJob)
assert_true(job.is_done)
assert_false(job.is_error)
- stdout, stderr = ipc.Popen(['djvudump', tmpfname], stdout=ipc.PIPE, stderr=ipc.PIPE, env={}).communicate()
+ stdout, stderr = ipc.Popen(['djvudump', tmpfname], stdout=ipc.PIPE, stderr=ipc.PIPE, env=c_env).communicate()
stdout = stdout.replace(b('\r\n'), b('\n'))
assert_equal(stderr, b(''))
stdout = stdout.split(b('\n'))
@@ -287,13 +314,15 @@
assert_equal(len(document.pages), 6)
assert_equal(len(document.files), 7)
+ c_env = dict(os.environ, LC_ALL='C')
+
tmp = tempfile.NamedTemporaryFile()
try:
job = document.export_ps(tmp.file)
assert_equal(type(job), SaveJob)
assert_true(job.is_done)
assert_false(job.is_error)
- stdout, stderr = ipc.Popen(['ps2ascii', tmp.name], stdout=ipc.PIPE, stderr=ipc.PIPE, env={}).communicate()
+ stdout, stderr = ipc.Popen(['ps2ascii', tmp.name], stdout=ipc.PIPE, stderr=ipc.PIPE, env=c_env).communicate()
assert_equal(stderr, b(''))
assert_equal(stdout, b('\x0c') * 6)
finally:
@@ -305,7 +334,7 @@
assert_equal(type(job), SaveJob)
assert_true(job.is_done)
assert_false(job.is_error)
- stdout, stderr = ipc.Popen(['ps2ascii', tmp.name], stdout=ipc.PIPE, stderr=ipc.PIPE, env={}).communicate()
+ stdout, stderr = ipc.Popen(['ps2ascii', tmp.name], stdout=ipc.PIPE, stderr=ipc.PIPE, env=c_env).communicate()
assert_equal(stderr, b(''))
stdout = stdout.split(b('\n'))
stdout = [b(' ').join(line.split()) for line in stdout]
@@ -555,7 +584,7 @@
try:
test_file = create_djvu(test_script)
except UnicodeEncodeError:
- raise AssertionError('You need to run this test with an UTF-8 locale')
+ raise SkipTest('you need to run this test with LC_CTYPE=C or LC_CTYPE=<lang>.UTF-8')
try:
context = Context()
document = context.new_document(FileUri(test_file.name))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/python-djvulibre-0.3.9/tests/test_sexpr.py new/python-djvulibre-0.3.10/tests/test_sexpr.py
--- old/python-djvulibre-0.3.9/tests/test_sexpr.py 2012-03-19 20:40:14.000000000 +0100
+++ new/python-djvulibre-0.3.10/tests/test_sexpr.py 2014-11-02 17:40:19.000000000 +0100
@@ -1,6 +1,6 @@
# encoding=UTF-8
-# Copyright © 2007-2012 Jakub Wilk
+# Copyright © 2007-2014 Jakub Wilk
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -406,10 +406,14 @@
with raises(ExpressionSyntaxError):
Expression.from_stream(42)
stderr = strip_line_numbers_from_traceback(stderr.getvalue())
+ stderr = stderr.replace(
+ '"sexpr.pyx"', # Cython < 0.21
+ '"djvu/sexpr.pyx"' # Cython ≥ 0.21
+ )
assert_multi_line_equal(stderr, '''\
Unhandled exception (42)
Traceback (most recent call last):
- File "sexpr.pyx", in djvu.sexpr._myio_getc (djvu/sexpr.c)
+ File "djvu/sexpr.pyx", in djvu.sexpr._myio_getc (djvu/sexpr.c)
AttributeError: 'int' object has no attribute 'read'
''')
@@ -467,10 +471,14 @@
with interim(sys, stderr=stderr):
self.expr.print_into(42)
stderr = strip_line_numbers_from_traceback(stderr.getvalue())
+ stderr = stderr.replace(
+ '"sexpr.pyx"', # Cython < 0.21
+ '"djvu/sexpr.pyx"' # Cython ≥ 0.21
+ )
expected_stderr = '''\
Unhandled exception (42)
Traceback (most recent call last):
- File "sexpr.pyx", in djvu.sexpr._myio_puts (djvu/sexpr.c)
+ File "djvu/sexpr.pyx", in djvu.sexpr._myio_puts (djvu/sexpr.c)
AttributeError: 'int' object has no attribute 'write'
'''
++++++ python-djvulibre.keyring ++++++
pub 4096R/015475F5 2009-10-23 [expires: 2015-01-01]
uid Jakub Wilk
uid Jakub Wilk
uid Jakub Wilk
sub 4096R/E5874F63 2009-10-23
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
bN5AxyPui0i3KQXs09FW/+n9DTw=
=1quD
-----END PGP PUBLIC KEY BLOCK-----
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org