Hello community,

here is the log from the commit of package python-exiv2 for openSUSE:Factory 
checked in at 2019-02-04 14:25:05
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-exiv2 (Old)
 and      /work/SRC/openSUSE:Factory/.python-exiv2.new.28833 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-exiv2"

Mon Feb  4 14:25:05 2019 rev:3 rq:670892 version:0.5.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-exiv2/python-exiv2.changes        
2018-06-28 15:15:02.275414928 +0200
+++ /work/SRC/openSUSE:Factory/.python-exiv2.new.28833/python-exiv2.changes     
2019-02-04 14:25:06.965062176 +0100
@@ -1,0 +2,13 @@
+Thu Jan 31 14:57:44 UTC 2019 - Andreas Schneider <[email protected]>
+
+- Update to version 0.5.0
+  * Several fixes for exiv2-0.27
+- Removed exiv2-1.0.27.patch (fixed upstream)
+
+-------------------------------------------------------------------
+Tue Jan 29 11:22:25 UTC 2019 - Tomáš Chvátal <[email protected]>
+
+- Add patch to build with latest exiv2 releases:
+  * exiv2-1.0.27.patch
+
+-------------------------------------------------------------------

Old:
----
  py3exiv2-0.3.0.tar.gz

New:
----
  py3exiv2-0.5.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-exiv2.spec ++++++
--- /var/tmp/diff_new_pack.3e5cSb/_old  2019-02-04 14:25:07.477061934 +0100
+++ /var/tmp/diff_new_pack.3e5cSb/_new  2019-02-04 14:25:07.477061934 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-exiv2
 #
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 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
@@ -12,32 +12,29 @@
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
 
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
-
 # This is a python3 only package
 %define         skip_python2 1
-
 Name:           python-exiv2
-Version:        0.3.0
+Version:        0.5.0
 Release:        0
 Summary:        Python3 bindings for the exiv2 library
 License:        GPL-3.0-only
 Group:          Development/Languages/Python
-Url:            https://launchpad.net/py3exiv2
+URL:            https://launchpad.net/py3exiv2
 Source:         
https://files.pythonhosted.org/packages/source/p/py3exiv2/py3exiv2-%{version}.tar.gz
-
 BuildRequires:  %{python_module devel}
 BuildRequires:  %{python_module setuptools}
 BuildRequires:  fdupes
 BuildRequires:  gcc-c++
 BuildRequires:  libboost_python3-devel
-BuildRequires:  libexiv2-devel
+BuildRequires:  pkgconfig
 BuildRequires:  python-rpm-macros
-
+BuildRequires:  pkgconfig(exiv2)
 %python_subpackages
 
 %description

++++++ py3exiv2-0.3.0.tar.gz -> py3exiv2-0.5.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/py3exiv2-0.3.0/PKG-INFO new/py3exiv2-0.5.0/PKG-INFO
--- old/py3exiv2-0.3.0/PKG-INFO 2018-05-15 12:57:16.000000000 +0200
+++ new/py3exiv2-0.5.0/PKG-INFO 2019-01-30 12:16:29.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: py3exiv2
-Version: 0.3.0
+Version: 0.5.0
 Summary: A Python3 binding to the library exiv2
 Home-page: https://launchpad.net/py3exiv2
 Author: Vincent Vande Vyvre
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/py3exiv2-0.3.0/setup.cfg new/py3exiv2-0.5.0/setup.cfg
--- old/py3exiv2-0.3.0/setup.cfg        2018-05-15 12:57:16.000000000 +0200
+++ new/py3exiv2-0.5.0/setup.cfg        2019-01-30 12:16:29.000000000 +0100
@@ -1,5 +1,4 @@
 [egg_info]
-tag_svn_revision = 0
 tag_build = 
 tag_date = 0
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/py3exiv2-0.3.0/setup.py new/py3exiv2-0.5.0/setup.py
--- old/py3exiv2-0.3.0/setup.py 2018-05-15 11:16:06.000000000 +0200
+++ new/py3exiv2-0.5.0/setup.py 2019-01-30 11:49:14.000000000 +0100
@@ -43,7 +43,7 @@
 
 setup(
     name='py3exiv2',
-    version='0.3.0',
+    version='0.5.0',
     description='A Python3 binding to the library exiv2',
     long_description=long_description,
     url='https://launchpad.net/py3exiv2',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/py3exiv2-0.3.0/src/exiv2wrapper.cpp 
new/py3exiv2-0.5.0/src/exiv2wrapper.cpp
--- old/py3exiv2-0.3.0/src/exiv2wrapper.cpp     2018-05-15 08:43:21.000000000 
+0200
+++ new/py3exiv2-0.5.0/src/exiv2wrapper.cpp     2019-01-29 12:31:06.000000000 
+0100
@@ -29,6 +29,7 @@
 #include "boost/python/stl_iterator.hpp"
 #include <fstream>
 
+
 // Custom error codes for Exiv2 exceptions
 #define METADATA_NOT_READ 101
 #define NON_REPEATABLE 102
@@ -38,9 +39,17 @@
 #define BUILTIN_NS 106
 #define NOT_REGISTERED 107
 
+#if EXIV2_MAJOR_VERSION >= 1 || (EXIV2_MAJOR_VERSION == 0 && 
EXIV2_MINOR_VERSION >= 27)
+#define HAVE_EXIV2_ERROR_CODE
+#endif
 // Custom macros
+#ifdef HAVE_EXIV2_ERROR_CODE
+#define CHECK_METADATA_READ \
+    if (!_dataRead) throw Exiv2::Error(Exiv2::kerErrorMessage, "metadata not 
read");
+#else
 #define CHECK_METADATA_READ \
     if (!_dataRead) throw Exiv2::Error(METADATA_NOT_READ);
+#endif
 
 namespace exiv2wrapper
 {
@@ -51,7 +60,11 @@
 
     // If an exception is thrown, it has to be done outside of the
     // Py_{BEGIN,END}_ALLOW_THREADS block.
+#ifdef HAVE_EXIV2_ERROR_CODE
+    Exiv2::Error error = Exiv2::Error(Exiv2::kerSuccess);
+#else
     Exiv2::Error error(0);
+#endif
 
     // Release the GIL to allow other python threads to run
     // while opening the file.
@@ -68,11 +81,19 @@
             _image = Exiv2::ImageFactory::open(_filename);
         }
     }
+
+#ifdef HAVE_EXIV2_ERROR_CODE
+    catch (Exiv2::Error& err) 
+    {
+        error = err;
+    }
+#else
     catch (Exiv2::Error& err)
     {
+        std::cout << "Caught Exiv2 exception '" << err << "'\n";
         error = err;
     }
-
+#endif
     // Re-acquire the GIL
     Py_END_ALLOW_THREADS
 
@@ -132,7 +153,11 @@
 {
     // If an exception is thrown, it has to be done outside of the
     // Py_{BEGIN,END}_ALLOW_THREADS block.
+#ifdef HAVE_EXIV2_ERROR_CODE
+    Exiv2::Error error = Exiv2::Error(Exiv2::kerSuccess);
+#else
     Exiv2::Error error(0);
+#endif
 
     // Release the GIL to allow other python threads to run
     // while reading metadata.
@@ -146,10 +171,17 @@
         _xmpData = &_image->xmpData();
         _dataRead = true;
     }
+#ifdef HAVE_EXIV2_ERROR_CODE
+    catch (Exiv2::Error& err) 
+    {
+        error = err;
+    }
+#else
     catch (Exiv2::Error& err)
     {
         error = err;
     }
+#endif
 
     // Re-acquire the GIL
     Py_END_ALLOW_THREADS
@@ -166,7 +198,11 @@
 
     // If an exception is thrown, it has to be done outside of the
     // Py_{BEGIN,END}_ALLOW_THREADS block.
+#ifdef HAVE_EXIV2_ERROR_CODE
+    Exiv2::Error error = Exiv2::Error(Exiv2::kerSuccess);
+#else
     Exiv2::Error error(0);
+#endif
 
     // Release the GIL to allow other python threads to run
     // while writing metadata.
@@ -176,10 +212,17 @@
     {
         _image->writeMetadata();
     }
+#ifdef HAVE_EXIV2_ERROR_CODE
+    catch (Exiv2::Error& err) 
+    {
+        error = err;
+    }
+#else
     catch (Exiv2::Error& err)
     {
         error = err;
     }
+#endif
 
     // Re-acquire the GIL
     Py_END_ALLOW_THREADS
@@ -229,9 +272,15 @@
     Exiv2::ExifKey exifKey = Exiv2::ExifKey(key);
 
     if(_exifData->findKey(exifKey) == _exifData->end())
+#ifdef HAVE_EXIV2_ERROR_CODE
+    {
+        throw Exiv2::Error(Exiv2::kerInvalidKey, key);
+    }
+#else
     {
         throw Exiv2::Error(KEY_NOT_FOUND, key);
     }
+#endif
 
     return ExifTag(key, &(*_exifData)[key], _exifData, _image->byteOrder());
 }
@@ -243,10 +292,15 @@
     Exiv2::ExifKey exifKey = Exiv2::ExifKey(key);
     Exiv2::ExifMetadata::iterator datum = _exifData->findKey(exifKey);
     if(datum == _exifData->end())
+#ifdef HAVE_EXIV2_ERROR_CODE
+    {
+        throw Exiv2::Error(Exiv2::kerInvalidKey, key);
+    }
+#else
     {
         throw Exiv2::Error(KEY_NOT_FOUND, key);
     }
-
+#endif
     _exifData->erase(datum);
 }
 
@@ -276,10 +330,15 @@
     Exiv2::IptcKey iptcKey = Exiv2::IptcKey(key);
 
     if(_iptcData->findKey(iptcKey) == _iptcData->end())
+#ifdef HAVE_EXIV2_ERROR_CODE
+    {
+        throw Exiv2::Error(Exiv2::kerInvalidKey, key);
+    }
+#else
     {
         throw Exiv2::Error(KEY_NOT_FOUND, key);
     }
-
+#endif
     return IptcTag(key, _iptcData);
 }
 
@@ -291,9 +350,15 @@
     Exiv2::IptcMetadata::iterator dataIterator = _iptcData->findKey(iptcKey);
 
     if (dataIterator == _iptcData->end())
+#ifdef HAVE_EXIV2_ERROR_CODE
+    {
+        throw Exiv2::Error(Exiv2::kerInvalidKey, key);
+    }
+#else
     {
         throw Exiv2::Error(KEY_NOT_FOUND, key);
     }
+#endif
 
     while (dataIterator != _iptcData->end())
     {
@@ -329,9 +394,15 @@
     Exiv2::XmpKey xmpKey = Exiv2::XmpKey(key);
 
     if(_xmpData->findKey(xmpKey) == _xmpData->end())
+#ifdef HAVE_EXIV2_ERROR_CODE
+    {
+        throw Exiv2::Error(Exiv2::kerInvalidKey, key);
+    }
+#else
     {
         throw Exiv2::Error(KEY_NOT_FOUND, key);
     }
+#endif
 
     return XmpTag(key, &(*_xmpData)[key]);
 }
@@ -347,7 +418,15 @@
         _xmpData->erase(i);
     }
     else
-        throw Exiv2::Error(KEY_NOT_FOUND, key);
+#ifdef HAVE_EXIV2_ERROR_CODE
+        {
+            throw Exiv2::Error(Exiv2::kerInvalidKey, key);
+        }
+#else
+        {
+            throw Exiv2::Error(KEY_NOT_FOUND, key);
+        }
+#endif
 }
 
 const std::string Image::getComment() const
@@ -389,7 +468,18 @@
 void Image::copyMetadata(Image& other, bool exif, bool iptc, bool xmp) const
 {
     CHECK_METADATA_READ
-    if (!other._dataRead) throw Exiv2::Error(METADATA_NOT_READ);
+    if (!other._dataRead) 
+    {
+#ifdef HAVE_EXIV2_ERROR_CODE
+        {
+            throw Exiv2::Error(Exiv2::kerErrorMessage, "metadata not read");
+        }
+#else
+        {
+            throw Exiv2::Error(METADATA_NOT_READ);
+        }
+#endif
+    }
 
     if (exif)
         other._image->setExifData(*_exifData);
@@ -399,7 +489,7 @@
         other._image->setXmpData(*_xmpData);
 }
 
-std::string Image::getDataBuffer() const
+boost::python::object Image::getDataBuffer() const
 {
     std::string buffer;
 
@@ -450,7 +540,9 @@
     // Re-acquire the GIL
     Py_END_ALLOW_THREADS
 
-    return buffer;
+    return boost::python::object(boost::python::handle<>(
+        PyBytes_FromStringAndSize(buffer.c_str(), buffer.size())
+        ));
 }
 
 Exiv2::ByteOrder Image::getByteOrder() const
@@ -547,7 +639,7 @@
 
 // Conditional code, exiv2 0.21 changed APIs we need
 // (see https://bugs.launchpad.net/pyexiv2/+bug/684177).
-#if EXIV2_TEST_VERSION(0,21,0)
+#if EXIV2_MAJOR_VERSION >= 1 || (EXIV2_MAJOR_VERSION == 0 && 
EXIV2_MINOR_VERSION >= 21)
     Exiv2::ExifKey exifKey(key);
     _type = Exiv2::TypeInfo::typeName(exifKey.defaultTypeId());
     // Where available, extract the type from the metadata, it is more reliable
@@ -604,9 +696,17 @@
 {
     int result = _datum->setValue(value);
     if (result != 0)
+#ifdef HAVE_EXIV2_ERROR_CODE
+    {
+        std::string message("Invalid value: ");
+        message += value;
+        throw Exiv2::Error(Exiv2::kerInvalidDataset, message);
+    }
+#else
     {
         throw Exiv2::Error(INVALID_VALUE);
     }
+#endif
 }
 
 void ExifTag::setParentImage(Image& image)
@@ -718,9 +818,17 @@
             {
                 ++nb_values;
                 if (!_repeatable && (nb_values > 1))
+#ifdef HAVE_EXIV2_ERROR_CODE
+                {
+                    std::string mssg("Tag not repeatable: ");
+                    mssg += key;
+                    throw Exiv2::Error(Exiv2::kerErrorMessage, mssg);
+                }
+#else
                 {
                     throw Exiv2::Error(NON_REPEATABLE);
                 }
+#endif
             }
         }
     }
@@ -740,7 +848,15 @@
     {
         // The tag is not repeatable but we are trying to assign it more than
         // one value.
+#ifdef HAVE_EXIV2_ERROR_CODE
+        {
+            throw Exiv2::Error(Exiv2::kerInvalidDataset, "Tag not repeatable");
+        }
+#else
+        {
         throw Exiv2::Error(NON_REPEATABLE);
+        }
+#endif
     }
 
     unsigned int index = 0;
@@ -754,9 +870,19 @@
             // Override an existing value
             int result = iterator->setValue(value);
             if (result != 0)
+#ifdef HAVE_EXIV2_ERROR_CODE
+            {
+                std::string mssg("Invalid value: ");
+                mssg += value;
+                // there's no invalid value error in libexiv2, so we use 
+                // kerInvalidDataset wich raise a Python ValueError
+                throw Exiv2::Error(Exiv2::kerInvalidDataset, mssg);
+            }
+#else
             {
                 throw Exiv2::Error(INVALID_VALUE);
             }
+#endif
             // Jump to the next datum matching the key
             ++iterator;
             while ((iterator != _data->end()) && (iterator->key() != 
_key.key()))
@@ -770,14 +896,30 @@
             Exiv2::Iptcdatum datum(_key);
             int result = datum.setValue(value);
             if (result != 0)
+#ifdef HAVE_EXIV2_ERROR_CODE
+            {
+                std::string mssg("Invalid value: ");
+                mssg += value;
+                throw Exiv2::Error(Exiv2::kerErrorMessage, mssg);
+            }
+#else
             {
                 throw Exiv2::Error(INVALID_VALUE);
             }
+#endif
             int state = _data->add(datum);
             if (state == 6)
+#ifdef HAVE_EXIV2_ERROR_CODE
+            {
+                std::string mssg("Tag not repeatable: ");
+                mssg += _key.key();
+                throw Exiv2::Error(Exiv2::kerErrorMessage, mssg);
+            }
+#else
             {
                 throw Exiv2::Error(NON_REPEATABLE);
             }
+#endif
             // Reset iterator that has been invalidated by appending a datum
             iterator = _data->end();
         }
@@ -1003,6 +1145,19 @@
 
 const boost::python::list XmpTag::getArrayValue()
 {
+#ifdef HAVE_EXIV2_ERROR_CODE
+    // We can't use &_datum->value())->value_ because value_ is private in
+    // this context (change in libexiv2 0.27)
+    const Exiv2::XmpArrayValue* xav = 
+            dynamic_cast<const Exiv2::XmpArrayValue*>(&_datum->value());
+    boost::python::list rvalue;
+    for(int i = 0; i < xav->count(); ++i)
+    {
+        std::string value = xav->toString(i);
+        rvalue.append(value);
+    }
+    return rvalue;
+#else
     std::vector<std::string> value =
         dynamic_cast<const Exiv2::XmpArrayValue*>(&_datum->value())->value_;
     boost::python::list rvalue;
@@ -1012,6 +1167,7 @@
         rvalue.append(*i);
     }
     return rvalue;
+#endif
 }
 
 const boost::python::dict XmpTag::getLangAltValue()
@@ -1058,7 +1214,352 @@
     fd.close();
 }
 
+#ifdef HAVE_EXIV2_ERROR_CODE
+void translateExiv2Error(Exiv2::Error const& error)
+{
+    // Use the Python 'C' API to set up an exception object
+    const char* message = error.what();
+    int code = error.code();
+    printf("%s: %d\n", message, code);
+    //int code = error.code();
+    //message += (char *) code;
+    // The type of the Python exception depends on the error code
+    // Warning: this piece of code should be updated in case the error codes
+    // defined by Exiv2 (file 'src/error.cpp') are changed
+    switch (error.code())
+    {
+        case 1:
+            // kerErrorMessage Unidentified error
+            PyErr_SetString(PyExc_RuntimeError, message);
+            break;
+        case 2:
+            // kerCallFailed {path}: Call to `{function}' failed: {strerror}
+            // May be raised when reading a file
+            PyErr_SetString(PyExc_RuntimeError, message);
+            break;
+        case 3:
+            // kerNotAnImage This does not look like a {image type} image
+            // May be raised by readMetadata()
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 4:
+            // kerInvalidDataset Invalid dataset name `{dataset name}'
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 5:
+            // kerInvalidRecord Invalid record name `{record name}'
+            // May be raised when instantiating an IptcKey from a string
+            PyErr_SetString(PyExc_KeyError, message);
+            break;
+        case 6:
+            // kerInvalidKey Invalid key `{key}'
+            // May be raised when instantiating an ExifKey, an IptcKey or an
+            // XmpKey from a string
+            PyErr_SetString(PyExc_KeyError, message);
+            break;
+        case 7:
+            // kerInvalidTag 
+            // Invalid tag name or ifdId `{tag name}', ifdId {ifdId}
+            // May be raised when instantiating an ExifKey from a string
+            PyErr_SetString(PyExc_KeyError, message);
+            break;
+        case 8:
+            // kerValueNotSet Value not set
+            // May be raised when calling value() on a datum
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 9:
+            // kerDataSourceOpenFailed 
+            // {path}: Failed to open the data source: {strerror}
+            // May be raised by readMetadata()
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 10:
+            // kerFileOpenFailed
+            // {path}: Failed to open file ({mode}): {strerror}
+            // May be raised by writeMetadata()
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 11:
+            // kerFileOpenFailed
+            // {path}: The file contains data of an unknown image type
+            // May be raised when opening an image
+            PyErr_SetString(PyExc_TypeError, message);
+            break;
+        case 12:
+            // kerMemoryContainsUnknownImageType
+            //The memory contains data of an unknown image type
+            // May be raised when instantiating an image from a data buffer
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 13:
+            // kerUnsupportedImageType Image type {image type} is not supported
+            // May be raised when creating a new image
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 14:
+            // kerFailedToReadImageData Failed to read image data
+            // May be raised by readMetadata()
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 15:
+            // kerNotAJpeg This does not look like a JPEG image
+            // May be raised by readMetadata()
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 17:
+            // kerFileRenameFailed 
+            // {old path}: Failed to rename file to {new path}: {strerror}
+            // May be raised by writeMetadata()
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 18:
+            // kerTransferFailed {path}: Transfer failed: {strerror}
+            // May be raised by writeMetadata()
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 19:
+            // kerMemoryTransferFailed Memory transfer failed: {strerror}
+            // May be raised by writeMetadata()
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 20:
+            // kerInputDataReadFailed Failed to read input data
+            // May be raised by writeMetadata()
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 21:
+            // kerImageWriteFailed Failed to write image
+            // May be raised by writeMetadata()
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 22:
+            // kerNoImageInInputData Input data does not contain a valid image
+            // May be raised by writeMetadata()
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 23:
+            // kerInvalidIfdId Invalid ifdId {ifdId}
+            // May be raised when instantiating an ExifKey from a tag and
+            // IFD item string
+            PyErr_SetString(PyExc_KeyError, message);
+            break;
+        case 24:
+            // kerValueTooLarge
+            // Entry::setValue: Value too large {tag}, {size}, {requested}
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 25:
+            // kerDataAreaValueTooLarge
+            // Entry::setDataArea: Value too large {tag}, {size}, {requested}
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 26:
+            // kerOffsetOutOfRange Offset out of range
+            // May be raised by writeMetadata() (TIFF)
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 27:
+            // kerUnsupportedDataAreaOffsetType
+            // Unsupported data area offset type
+            // May be raised by writeMetadata() (TIFF)
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 28:
+            // kerInvalidCharset Invalid charset: `{charset name}'
+            // May be raised when instantiating a CommentValue from a string
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 29:
+            // kerUnsupportedDateFormat Unsupported date format
+            // May be raised when instantiating a DateValue from a string
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 30:
+            // kerUnsupportedTimeFormat Unsupported time format
+            // May be raised when instantiating a TimeValue from a string
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 31:
+            // kerWritingImageFormatUnsupported 
+            // Writing to {image format} images is not supported
+            // May be raised by writeMetadata() for certain image types
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 32:
+            // kerInvalidSettingForImage 
+            // Setting {metadata type} in {image format} images is not 
supported
+            // May be raised when setting certain types of metadata for certain
+            // image types that don't support them
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 33:
+            // kerNotACrwImage This does not look like a CRW image
+            // May be raised by readMetadata() (CRW)
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 34:
+            // kerFunctionNotSupported {function}: Not supported
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 35:
+            // kerNoNamespaceInfoForXmpPrefix
+            // No namespace info available for XMP prefix `{prefix}'
+            // May be raised when retrieving property info for an XmpKey
+            PyErr_SetString(PyExc_KeyError, message);
+            break;
+        case 36:
+            // kerNoPrefixForNamespace
+            // No prefix registered for namespace `{namespace}', needed for
+            // property path `{property path}'
+            // May be raised by readMetadata() when reading the XMP data
+            PyErr_SetString(PyExc_KeyError, message);
+            break;
+        case 37:
+            // kerTooLargeJpegSegment
+            // Size of {type of metadata} JPEG segment is larger than
+            // 65535 bytes
+            // May be raised by writeMetadata() (JPEG)
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 38:
+            // kerUnhandledXmpdatum
+            // Unhandled Xmpdatum {key} of type {value type}
+            // May be raised by readMetadata() when reading the XMP data
+            PyErr_SetString(PyExc_TypeError, message);
+            break;
+        case 39:
+            // kerUnhandledXmpNode
+            // Unhandled XMP node {key} with opt={XMP Toolkit option flags}
+            // May be raised by readMetadata() when reading the XMP data
+            PyErr_SetString(PyExc_TypeError, message);
+            break;
+        case 40:
+            // kerXMPToolkitError
+            // XMP Toolkit error {error id}: {error message}
+            // May be raised by readMetadata() when reading the XMP data
+            PyErr_SetString(PyExc_RuntimeError, message);
+            break;
+        case 41:
+            // kerDecodeLangAltPropertyFailed
+            // Failed to decode Lang Alt property {property path}
+            // with opt={XMP Toolkit option flags}
+            // May be raised by readMetadata() when reading the XMP data
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 42:
+            // kerDecodeLangAltQualifierFailed
+            // Failed to decode Lang Alt qualifier {qualifier path}
+            // with opt={XMP Toolkit option flags}
+            // May be raised by readMetadata() when reading the XMP data
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 43:
+            // kerEncodeLangAltPropertyFailed
+            // Failed to encode Lang Alt property {key}
+            // May be raised by writeMetadata()
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 44:
+            // kerPropertyNameIdentificationFailed
+            // Failed to determine property name from path {property path},
+            // namespace {namespace}
+            // May be raised by readMetadata() when reading the XMP data
+            PyErr_SetString(PyExc_KeyError, message);
+            break;
+        case 45:
+            // kerSchemaNamespaceNotRegistered
+            // Schema namespace {namespace} is not registered with
+            // the XMP Toolkit
+            // May be raised by readMetadata() when reading the XMP data
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 46:
+            // kerNoNamespaceForPrefix
+            // No namespace registered for prefix `{prefix}'
+            // May be raised when instantiating an XmpKey from a string
+            PyErr_SetString(PyExc_KeyError, message);
+            break;
+        case 47:
+            // kerAliasesNotSupported
+            // Aliases are not supported. Please send this XMP packet
+            // to [email protected] `{namespace}', `{property path}', `{value}'
+            // May be raised by readMetadata() when reading the XMP data
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 48:
+            // kerInvalidXmpText
+            // Invalid XmpText type `{type}'
+            // May be raised when instantiating an XmpTextValue from a string
+            PyErr_SetString(PyExc_TypeError, message);
+            break;
+        case 49:
+            // kerTooManyTiffDirectoryEntries
+            // TIFF directory {TIFF directory name} has too many entries
+            // May be raised by writeMetadata() (TIFF)
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        // Added in py3exiv2
+        case 50:
+            // kerMultipleTiffArrayElementTagsInDirectory
+            // Multiple TIFF array element tags {number} in one directory")
+            // May be raised by readMetadata() (TIFF)
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 51:
+            // kerWrongTiffArrayElementTagType
+            // TIFF array element tag {number} has wrong type") }, // %1=tag 
number
+            // May be raised by readMetadata() (TIFF)
+            PyErr_SetString(PyExc_TypeError, message);
+            break;
+        // Added in libexiv2 0.27
+        case 52:
+            // kerInvalidKeyXmpValue {key} has invalid XMP value type {type}
+            // May be raised by readMetadata() when reading the XMP data
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 53:
+            // kerInvalidIccProfile Not a valid ICC Profile
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 54:
+            // kerInvalidXMP Not valid XMP
+            PyErr_SetString(PyExc_TypeError, message);
+            break;
+        case 55:
+            // kerTiffDirectoryTooLarge tiff directory length is too large
+            PyErr_SetString(PyExc_ValueError, message);
+            break;
+        case 56:
+            // kerInvalidTypeValue
+            // Invalid type value detected in Image::printIFDStructure
+            PyErr_SetString(PyExc_TypeError, message);
+            break;
+        case 57:
+            // kerInvalidMalloc
+            // Invalid memory allocation request
+            PyErr_SetString(PyExc_MemoryError, message);
+            break;
+        case 58:
+            // kerCorruptedMetadata Corrupted image metadata
+            PyErr_SetString(PyExc_IOError, message);
+            break;
+        case 59:
+            // kerArithmeticOverflow Arithmetic operation overflow
+            PyErr_SetString(PyExc_OverflowError, message);
+            break;
+        case 60:
+            // kerMallocFailed Memory allocation failed
+            PyErr_SetString(PyExc_MemoryError, message);
+            break;
 
+        // Default handler
+        default:
+            PyErr_SetString(PyExc_RuntimeError, message);
+    }
+}
+    
+#else
 void translateExiv2Error(Exiv2::Error const& error)
 {
     // Use the Python 'C' API to set up an exception object
@@ -1119,7 +1620,7 @@
         case 11:
             // {path}: The file contains data of an unknown image type
             // May be raised when opening an image
-            PyErr_SetString(PyExc_IOError, message);
+            PyErr_SetString(PyExc_TypeError, message);
             break;
         case 12:
             // The memory contains data of an unknown image type
@@ -1345,6 +1846,7 @@
             PyErr_SetString(PyExc_RuntimeError, message);
     }
 }
+#endif
 
 
 void registerXmpNs(const std::string& name, const std::string& prefix)
@@ -1353,6 +1855,7 @@
     {
         const std::string& ns = Exiv2::XmpProperties::ns(prefix);
     }
+
     catch (Exiv2::Error& error)
     {
         // No namespace exists with the requested prefix, it is safe to
@@ -1360,7 +1863,17 @@
         Exiv2::XmpProperties::registerNs(name, prefix);
         return;
     }
-    throw Exiv2::Error(EXISTING_PREFIX, prefix);
+#ifdef HAVE_EXIV2_ERROR_CODE
+    {
+        std::string mssg("Namespace already exists: ");
+        mssg += prefix;
+        throw Exiv2::Error(Exiv2::kerInvalidKey, mssg);
+    }
+#else
+    {
+        throw Exiv2::Error(EXISTING_PREFIX, prefix);
+    }
+#endif
 }
 
 void unregisterXmpNs(const std::string& name)
@@ -1379,12 +1892,30 @@
             return;
         }
         // The namespace hasn’t been unregistered because it’s builtin.
-        throw Exiv2::Error(BUILTIN_NS, name);
+#ifdef HAVE_EXIV2_ERROR_CODE
+        {
+            std::string mssg("Can't unregister builtin namespace: ");
+            mssg += name;
+            throw Exiv2::Error(Exiv2::kerInvalidKey, mssg);
+        }
+#else
+        {
+            throw Exiv2::Error(BUILTIN_NS, name);
+        }
+#endif
     }
     else
+#ifdef HAVE_EXIV2_ERROR_CODE
+    {
+        std::string mssg("Namespace does not exists: ");
+        mssg += name;
+        throw Exiv2::Error(Exiv2::kerInvalidKey, mssg);
+    }
+#else
     {
         throw Exiv2::Error(NOT_REGISTERED, name);
-    } 
+    }
+#endif
 }
 
 void unregisterAllXmpNs()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/py3exiv2-0.3.0/src/exiv2wrapper.hpp 
new/py3exiv2-0.5.0/src/exiv2wrapper.hpp
--- old/py3exiv2-0.3.0/src/exiv2wrapper.hpp     2018-05-15 08:43:02.000000000 
+0200
+++ new/py3exiv2-0.5.0/src/exiv2wrapper.hpp     2019-01-29 12:21:47.000000000 
+0100
@@ -1,7 +1,7 @@
 // 
*****************************************************************************
 /*
  * Copyright (C) 2006-2010 Olivier Tilloy <[email protected]>
- * Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]>
+ * Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]>
  *
  * This file is part of the py3exiv2 distribution.
  *
@@ -248,7 +248,7 @@
     void copyMetadata(Image& other, bool exif=true, bool iptc=true, bool 
xmp=true) const;
 
     // Return the image data buffer.
-    std::string getDataBuffer() const;
+    boost::python::object getDataBuffer() const;
 
     // Accessors
     Exiv2::ExifData* getExifData() { return _exifData; };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/py3exiv2-0.3.0/src/exiv2wrapper_python.cpp 
new/py3exiv2-0.5.0/src/exiv2wrapper_python.cpp
--- old/py3exiv2-0.3.0/src/exiv2wrapper_python.cpp      2018-05-15 
08:44:07.000000000 +0200
+++ new/py3exiv2-0.5.0/src/exiv2wrapper_python.cpp      2019-01-29 
12:23:14.000000000 +0100
@@ -1,7 +1,7 @@
 // 
*****************************************************************************
 /*
  * Copyright (C) 2006-2012 Olivier Tilloy <[email protected]>
- * Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]>
+ * Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]>
  *
  * This file is part of the pyexiv2 distribution.
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/py3exiv2-0.3.0/src/py3exiv2.egg-info/PKG-INFO 
new/py3exiv2-0.5.0/src/py3exiv2.egg-info/PKG-INFO
--- old/py3exiv2-0.3.0/src/py3exiv2.egg-info/PKG-INFO   2018-05-15 
12:57:16.000000000 +0200
+++ new/py3exiv2-0.5.0/src/py3exiv2.egg-info/PKG-INFO   2019-01-30 
12:16:29.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: py3exiv2
-Version: 0.3.0
+Version: 0.5.0
 Summary: A Python3 binding to the library exiv2
 Home-page: https://launchpad.net/py3exiv2
 Author: Vincent Vande Vyvre
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/py3exiv2-0.3.0/src/pyexiv2/__init__.py 
new/py3exiv2-0.5.0/src/pyexiv2/__init__.py
--- old/py3exiv2-0.3.0/src/pyexiv2/__init__.py  2018-05-15 08:49:05.000000000 
+0200
+++ new/py3exiv2-0.5.0/src/pyexiv2/__init__.py  2019-01-30 08:40:24.000000000 
+0100
@@ -3,7 +3,7 @@
 # 
******************************************************************************
 #
 # Copyright (C) 2006-2011 Olivier Tilloy <[email protected]>
-# Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]>
+# Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]>
 #
 # This file is part of the py3exiv2 distribution.
 #
@@ -75,7 +75,7 @@
 
 
 #: A tuple containing the three components of the version number: major, 
minor, micro.
-version_info = (0, 3, 0)
+version_info = (0, 5, 0)
 
 #: The version of the module as a string (major.minor.micro).
 __version__ = _make_version(version_info)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/py3exiv2-0.3.0/src/pyexiv2/exif.py 
new/py3exiv2-0.5.0/src/pyexiv2/exif.py
--- old/py3exiv2-0.3.0/src/pyexiv2/exif.py      2018-02-02 14:19:27.000000000 
+0100
+++ new/py3exiv2-0.5.0/src/pyexiv2/exif.py      2019-01-30 08:40:36.000000000 
+0100
@@ -3,7 +3,7 @@
 # 
******************************************************************************
 #
 # Copyright (C) 2006-2011 Olivier Tilloy <[email protected]>
-# Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]>
+# Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]>
 #
 # This file is part of the py3exiv2 distribution.
 #
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/py3exiv2-0.3.0/src/pyexiv2/iptc.py 
new/py3exiv2-0.5.0/src/pyexiv2/iptc.py
--- old/py3exiv2-0.3.0/src/pyexiv2/iptc.py      2018-02-02 14:29:01.000000000 
+0100
+++ new/py3exiv2-0.5.0/src/pyexiv2/iptc.py      2019-01-30 08:40:55.000000000 
+0100
@@ -3,7 +3,7 @@
 # 
******************************************************************************
 #
 # Copyright (C) 2006-2011 Olivier Tilloy <[email protected]>
-# Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]>
+# Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]>
 #
 # This file is part of the py3exiv2 distribution.
 #
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/py3exiv2-0.3.0/src/pyexiv2/metadata.py 
new/py3exiv2-0.5.0/src/pyexiv2/metadata.py
--- old/py3exiv2-0.3.0/src/pyexiv2/metadata.py  2018-05-15 09:05:09.000000000 
+0200
+++ new/py3exiv2-0.5.0/src/pyexiv2/metadata.py  2019-01-30 08:41:11.000000000 
+0100
@@ -3,7 +3,7 @@
 # 
******************************************************************************
 #
 # Copyright (C) 2006-2011 Olivier Tilloy <[email protected]>
-# Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]>
+# Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]>
 #
 # This file is part of the py3exiv2 distribution.
 #
@@ -477,11 +477,12 @@
 
     @property
     def buffer(self):
-        """The image buffer as a string.
-
         """
-        #XXX Deprecated
-        return
+        The image buffer as a string.
+        If metadata has been modified, the data won't be up-to-date until
+        :meth:`.write` has been called.
+        """
+        return self._image._getDataBuffer()
 
     @property
     def exif_thumbnail(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/py3exiv2-0.3.0/src/pyexiv2/preview.py 
new/py3exiv2-0.5.0/src/pyexiv2/preview.py
--- old/py3exiv2-0.3.0/src/pyexiv2/preview.py   2018-02-02 14:38:54.000000000 
+0100
+++ new/py3exiv2-0.5.0/src/pyexiv2/preview.py   2019-01-30 08:41:48.000000000 
+0100
@@ -3,7 +3,7 @@
 # 
******************************************************************************
 #
 # Copyright (C) 2010 Olivier Tilloy <[email protected]>
-# Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]>
+# Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]>
 #
 # This file is part of the py3exiv2 distribution.
 #
@@ -68,13 +68,14 @@
         """
         return self.__preview.dimensions
 
-    @property
-    def data(self):
-        """The preview image data buffer.
-
-        """
-        buf = bytes(self.__preview.data)
-        return buf
+    #@property
+    #def data(self):
+        #"""The preview image data buffer.
+
+        #"""
+        # TODO
+        #buf = bytes(self.__preview.data)
+        #return buf
 
     def write_to_file(self, path):
         """Write the preview image to a file on disk.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/py3exiv2-0.3.0/src/pyexiv2/utils.py 
new/py3exiv2-0.5.0/src/pyexiv2/utils.py
--- old/py3exiv2-0.3.0/src/pyexiv2/utils.py     2018-02-02 15:26:42.000000000 
+0100
+++ new/py3exiv2-0.5.0/src/pyexiv2/utils.py     2019-01-30 08:42:17.000000000 
+0100
@@ -3,7 +3,7 @@
 # 
******************************************************************************
 #
 # Copyright (C) 2006-2012 Olivier Tilloy <[email protected]>
-# Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]>
+# Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]>
 #
 # This file is part of the py3exiv2 distribution.
 #
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/py3exiv2-0.3.0/src/pyexiv2/xmp.py 
new/py3exiv2-0.5.0/src/pyexiv2/xmp.py
--- old/py3exiv2-0.3.0/src/pyexiv2/xmp.py       2018-05-15 08:52:04.000000000 
+0200
+++ new/py3exiv2-0.5.0/src/pyexiv2/xmp.py       2019-01-30 08:43:19.000000000 
+0100
@@ -3,7 +3,7 @@
 # 
******************************************************************************
 #
 # Copyright (C) 2006-2011 Olivier Tilloy <[email protected]>
-# Copyright (C) 2015-2018 Vincent Vande Vyvre <[email protected]>
+# Copyright (C) 2015-2019 Vincent Vande Vyvre <[email protected]>
 #
 # This file is part of the py3exiv2 distribution.
 #


Reply via email to