[Git][debian-gis-team/glymur][upstream] New upstream version 0.9.3

Antonio Valentino gitlab at salsa.debian.org
Sat Jan 9 08:54:25 GMT 2021



Antonio Valentino pushed to branch upstream at Debian GIS Project / glymur


Commits:
c39de64a by Antonio Valentino at 2021-01-09T08:18:38+00:00
New upstream version 0.9.3
- - - - -


18 changed files:

- .travis.yml
- ci/doc.yml
- ci/travis-38.yaml
- + ci/travis-39-opj2p4.yaml
- + ci/travis-39.yaml
- docs/source/conf.py
- docs/source/how_do_i.rst
- docs/source/introduction.rst
- docs/source/whatsnew/0.9.rst
- glymur/config.py
- glymur/jp2k.py
- glymur/lib/openjp2.py
- glymur/version.py
- setup.py
- tests/test_config.py
- tests/test_jp2k.py
- tests/test_openjp2.py
- tests/test_printing.py


Changes:

=====================================
.travis.yml
=====================================
@@ -2,21 +2,27 @@ language: python
 matrix:
     fast_finish: true
     include:
-    - python: 3.6
-      env:
-        - JOB="3.6 No OPENJPEG" ENV_FILE="ci/travis-36-no-opj.yaml"
-    - python: 3.6
-      env:
-        - JOB="3.6" ENV_FILE="ci/travis-36.yaml"
-    - python: 3.7
-      env:
-        - JOB="3.7" ENV_FILE="ci/travis-37.yaml"
-    - python: 3.7
-      env:
-        - JOB="3.7" ENV_FILE="ci/travis-37-no-gdal.yaml"
-    - python: 3.8
-      env:
-        - JOB="3.8" ENV_FILE="ci/travis-38.yaml"
+      - python: 3.9-dev
+        env:
+          - JOB="3.9" ENV_FILE="ci/travis-39.yaml"
+      - python: 3.9-dev
+        env:
+          - JOB="3.9 opj 2.4" ENV_FILE="ci/travis-39-opj2p4.yaml"
+      - python: 3.8
+        env:
+          - JOB="3.8" ENV_FILE="ci/travis-38.yaml"
+      - python: 3.7
+        env:
+          - JOB="3.7" ENV_FILE="ci/travis-37.yaml"
+      - python: 3.7
+        env:
+          - JOB="3.7" ENV_FILE="ci/travis-37-no-gdal.yaml"
+      - python: 3.6
+        env:
+          - JOB="3.6 No OPENJPEG" ENV_FILE="ci/travis-36-no-opj.yaml"
+      - python: 3.6
+        env:
+          - JOB="3.6" ENV_FILE="ci/travis-36.yaml"
 before_install:
   - echo "before_install"
   - sudo apt-get update


=====================================
ci/doc.yml
=====================================
@@ -5,5 +5,3 @@ dependencies:
     - python=3.7
     - numpydoc>=0.8
     - sphinx_rtd_theme>=0.4.2
-    - mock>=2.0.0
-    - contextlib2>=0.5.5


=====================================
ci/travis-38.yaml
=====================================
@@ -1,6 +1,6 @@
 name: glymur
 channels:
-    - conda-forge
+    - defaults
 dependencies:
     - python=3.8.*
     - gdal


=====================================
ci/travis-39-opj2p4.yaml
=====================================
@@ -0,0 +1,8 @@
+name: glymur
+channels:
+    - conda-forge
+dependencies:
+    - python=3.9.*
+    - lxml
+    - numpy
+    - openjpeg >= 2.4.0


=====================================
ci/travis-39.yaml
=====================================
@@ -0,0 +1,10 @@
+name: glymur
+channels:
+    - conda-forge
+dependencies:
+    - python=3.9.*
+    - gdal
+    - lxml
+    - numpy
+    - openjpeg
+    - scikit-image


=====================================
docs/source/conf.py
=====================================
@@ -78,7 +78,7 @@ copyright = '2013-2020, John Evans'
 # The short X.Y version.
 version = '0.9'
 # The full version, including alpha/beta/rc tags.
-release = '0.9.2'
+release = '0.9.3'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.


=====================================
docs/source/how_do_i.rst
=====================================
@@ -57,6 +57,30 @@ or::
     >>> jp2[:] = data
 
 
+**********************************************
+... write images using multithreaded encoding?
+**********************************************
+If you have glymur 0.9.2 or higher
+and OpenJPEG 2.4.0 or higher,
+you can make use of OpenJPEG's thread support to speed-up read operations.
+With a puny 2015 macbook, just two cores, and a 5824x10368x3 image, we get::
+
+    >>> import time, numpy as np, glymur
+    >>> data = glymur.Jp2k(glymur.data.nemo())[:]
+    >>> data = np.tile(data, (4, 4, 1))
+    >>> t0 = time.time()
+    >>> glymur.Jp2k('1thread.jp2', data)
+    >>> t1 = time.time()
+    >>> print(f'1 thread:  {(t1 - t0):.3} seconds')
+    12.0 seconds
+    >>> t0 = time.time()
+    >>> glymur.set_option('lib.num_threads', 2)
+    >>> glymur.Jp2k('2threads.jp2', data)
+    >>> t1 = time.time()
+    >>> print(f'2 threads:  {(t1 - t0):.3} seconds')
+    7.24 seconds
+
+
 ************************************************************************
 ... write images with different compression ratios for different layers?
 ************************************************************************
@@ -83,13 +107,13 @@ Values must be increasing, but the last value may be 0 to indicate
 the layer is lossless.  However, the OpenJPEG library will reorder
 the layers to make the first layer lossless, not the last. ::
 
-    >>> import skimage.data, skimage.measure, glymur
+    >>> import skimage.data, skimage.metrics, glymur
     >>> truth = skimage.data.camera()
     >>> jp2 = glymur.Jp2k('myfile.jp2', data=truth, psnr=[30, 40, 50, 0])
     >>> psnr = []
     >>> for layer in range(4):
     ...     jp2.layer = layer
-    ...     psnr.append(skimage.measure.compare_psnr(truth, jp2[:]))
+    ...     psnr.append(skimage.metrics.peak_signal_noise_ratio(truth, jp2[:]))
     >>> print(psnr)
     [inf, 29.028560403833303, 39.206919416670402, 47.593129828702246]
 


=====================================
docs/source/introduction.rst
=====================================
@@ -15,7 +15,7 @@ Glymur will look to use **lxml** when processing boxes with XML content, but can
 fall back upon the standard library's **ElementTree** if **lxml** is not
 available.
 
-The current version of glymur works on Python versions 3.6, 3.7, and 3.8.
+The current version of glymur works on Python versions 3.6, 3.7, 3.8, and 3.9.
 
 For more information about OpenJPEG, please consult http://www.openjpeg.org.
 


=====================================
docs/source/whatsnew/0.9.rst
=====================================
@@ -2,6 +2,14 @@
 Changes in glymur 0.9
 #####################
 
+****************
+Changes in 0.9.3
+****************
+
+    * Qualify on Python 3.9
+    * Qualify on OpenJPEG 2.4.0
+    * Add support for multithreaded writes.
+
 ****************
 Changes in 0.9.2
 ****************


=====================================
glymur/config.py
=====================================
@@ -7,7 +7,6 @@ from ctypes.util import find_library
 import os
 import pathlib
 import platform
-import sys
 import warnings
 
 
@@ -42,11 +41,11 @@ def _determine_full_path(libname):
     Parameters
     ----------
     libname : str
-        Short name for library (openjp2).
+        short name for library (openjp2)
 
     Returns
     -------
-    Path to openjp2 library.
+    path to openjp2 library or None if openjp2 library not found
     """
 
     # A location specified by the glymur configuration file has precedence.
@@ -54,45 +53,19 @@ def _determine_full_path(libname):
     if path is not None:
         return path
 
-    # No joy on configuration file.
-    # Are we using Anaconda?
-    if (
-        'Anaconda' in sys.version
-        or 'Continuum Analytics, Inc.' in sys.version
-        or 'packaged by conda-forge' in sys.version
-    ):
-        # If Anaconda, then openjpeg may have been installed via conda.
-        if platform.system() in ['Linux', 'Darwin']:
-            suffix = '.so' if platform.system() == 'Linux' else '.dylib'
-            basedir = pathlib.Path(sys.executable).parents[1]
-            path = basedir / 'lib' / ('lib' + libname + suffix)
-        elif platform.system() == 'Windows':
-            basedir = pathlib.Path(sys.executable).parents[0]
-            path = basedir / 'Library' / 'bin' / (libname + '.dll')
-
-        return path
-
-    # No joy on config file or Anaconda.
-    # MacPorts?
-    path = pathlib.Path('/opt/local/lib/libopenjp2.dylib')
-    if platform.system() == 'Darwin' and path.exists():
-        return path
-
-    # No joy on config file or Anaconda or macports.
-    # Cygwin?
-    g = pathlib.Path('/usr/bin').glob('cygopenjp2*.dll')
-    try:
-        path = list(g)[0]
-    except IndexError:
-        # If the generator is None... probably not on cygwin.
-        # Try something else.
-        pass
-    else:
-        if platform.system().startswith('CYGWIN') and path.exists():
-            return path
-
-    # No joy on config file, not Anaconda or MacPorts or Cygwin.
-    # Can ctypes find it anyway?
+    # No joy on config file.  Cygwin?  Cygwin is a bit of an odd case.
+    if platform.system().startswith('CYGWIN'):
+        g = pathlib.Path('/usr/bin').glob('cygopenjp2*.dll')
+        try:
+            path = list(g)[0]
+        except IndexError:
+            # openjpeg possibly not installed
+            pass
+        else:
+            if path.exists():
+                return path
+
+    # No joy on config file and not Cygwin.  Can ctypes find it anyway?
     path = find_library(libname)
     if path is not None:
         return pathlib.Path(path)


=====================================
glymur/jp2k.py
=====================================
@@ -750,6 +750,17 @@ class Jp2k(Jp2kBox):
 
             strm = opj2.stream_create_default_file_stream(self.filename,
                                                           False)
+            num_threads = get_option('lib.num_threads')
+            if version.openjpeg_version >= '2.4.0':
+                opj2.codec_set_threads(codec, num_threads)
+            elif num_threads > 1:
+                msg = (
+                    f'Threaded encoding is not supported in library versions '
+                    f'prior to 2.4.0.  Your version is '
+                    f'{version.openjpeg_version}.'
+                )
+                warnings.warn(msg, UserWarning)
+
             stack.callback(opj2.stream_destroy, strm)
 
             opj2.start_compress(codec, image, strm)


=====================================
glymur/lib/openjp2.py
=====================================
@@ -1341,7 +1341,7 @@ def stream_destroy(stream):
     OPENJP2.opj_stream_destroy(stream)
 
 
-def write_tile(codec, tile_index, data, data_size, stream):
+def write_tile(codec, tile_index, data, *pargs):
     """Wraps openjp2 library function opj_write_tile.
 
     Write a tile into an image.
@@ -1354,8 +1354,8 @@ def write_tile(codec, tile_index, data, data_size, stream):
         The index of the tile to write, zero-indexing assumed
     data : array
         Image data arranged in usual C-order
-    data_size : int
-        Size of a tile in bytes
+    data_size : int, optional
+        Size of a tile in bytes.  If not provided, it will be inferred.
     stream : STREAM_TYPE_P
         The stream to write data to
 
@@ -1364,6 +1364,14 @@ def write_tile(codec, tile_index, data, data_size, stream):
     RuntimeError
         If the OpenJPEG library routine opj_write_tile fails.
     """
+    if len(pargs) == 2:
+        # old signature
+        data_size, stream = pargs
+    else:
+        # new signature
+        data_size = data.nbytes
+        stream = pargs[0]
+
     OPENJP2.opj_write_tile.argtypes = [CODEC_TYPE,
                                        ctypes.c_uint32,
                                        ctypes.POINTER(ctypes.c_uint8),


=====================================
glymur/version.py
=====================================
@@ -20,7 +20,7 @@ from .lib import openjp2 as opj2
 
 # Do not change the format of this next line!  Doing so risks breaking
 # setup.py
-version = "0.9.2"
+version = "0.9.3"
 _sv = LooseVersion(version)
 version_tuple = _sv.version
 


=====================================
setup.py
=====================================
@@ -27,6 +27,7 @@ kwargs['classifiers'] = [
     "Programming Language :: Python :: 3.6",
     "Programming Language :: Python :: 3.7",
     "Programming Language :: Python :: 3.8",
+    "Programming Language :: Python :: 3.9",
     "Programming Language :: Python :: Implementation :: CPython",
     "License :: OSI Approved :: MIT License",
     "Development Status :: 5 - Production/Stable",


=====================================
tests/test_config.py
=====================================
@@ -3,11 +3,10 @@ OPENJP2 may be present in some form or other.
 """
 # Standard library imports ...
 import contextlib
-import imp
+import importlib
 import os
 import pathlib
 import platform
-import sys
 import unittest
 from unittest.mock import patch
 import warnings
@@ -59,62 +58,9 @@ class TestSuitePathToLibrary(fixtures.TestCommon):
         """
         super(TestSuitePathToLibrary, self).tearDown()
 
-        imp.reload(glymur)
-        imp.reload(glymur.lib.openjp2)
+        importlib.reload(glymur)
+        importlib.reload(glymur.lib.openjp2)
 
-    @patch('glymur.config.platform.system')
-    @patch('glymur.config.sys.version', 'Anaconda')
-    @patch('glymur.config.sys.executable', '/opt/anaconda/bin/python')
-    def test_anaconda_on_mac(self, mock_platform_system):
-        """
-        SCENARIO:  the platform is Anaconda on mac.
-
-        EXPECTED RESULT:  the path of the openjp2 library is under the anaconda
-        root.
-        """
-        mock_platform_system.return_value = 'Darwin'
-
-        actual = glymur.config._determine_full_path('openjp2')
-        expected = pathlib.Path('/opt/anaconda/lib/libopenjp2.dylib')
-
-        self.assertEqual(actual, expected)
-
-    @unittest.skipIf(platform.system() == 'Windows', 'nonsensical on windows')
-    @patch('glymur.config.platform.system')
-    @patch('glymur.config.sys.version', 'Anaconda')
-    @patch('glymur.config.sys.executable', '/usr/bin/python')
-    def test_windows_path(self, mock_platform_system):
-        """
-        SCENARIO:  the platform is Anaconda on windows, even though we are not
-        actually running on windows.
-
-        EXPECTED RESULT:  the path of the openjp2 library is an Anaconda DLL
-        """
-        mock_platform_system.return_value = 'Windows'
-
-        actual = glymur.config._determine_full_path('openjp2')
-        expected = pathlib.Path('/usr/bin/Library/bin/openjp2.dll')
-
-        self.assertEqual(actual, expected)
-
-    @patch('pathlib.Path.exists')
-    @patch('glymur.config.sys.version', 'not anaconda')
-    @patch('glymur.config.platform.system')
-    def test_macports(self, mock_platform_system, mock_path_exists):
-        """
-        SCENARIO:  the platform is MacPorts.
-
-        EXPECTED RESULT:  the path of the openjp2 library is in /opt/local
-        """
-        mock_platform_system.return_value = 'Darwin'
-        mock_path_exists.return_value = True
-
-        actual = glymur.config._determine_full_path('openjp2')
-        expected = pathlib.Path('/opt/local/lib/libopenjp2.dylib')
-
-        self.assertEqual(actual, expected)
-
-    @patch('glymur.config.sys.version', 'not anaconda')
     @patch('glymur.config.find_library')
     @patch('glymur.config.platform.system')
     def test_via_ctypes(self, mock_platform_system, mock_find_library):
@@ -142,7 +88,6 @@ class TestSuite(fixtures.TestCommon):
     problem in CI environments, just development environments.
     """
 
-    @patch('glymur.config.sys.version', 'not anaconda')
     @patch('glymur.config.find_library')
     @patch('glymur.config.platform.system')
     def test_not_via_ctypes(self,
@@ -243,8 +188,8 @@ class TestSuiteConfigFile(fixtures.TestCommon):
         """
         super(TestSuiteConfigFile, self).tearDown()
 
-        imp.reload(glymur)
-        imp.reload(glymur.lib.openjp2)
+        importlib.reload(glymur)
+        importlib.reload(glymur.lib.openjp2)
 
     def test_config_file_via_environ(self):
         """
@@ -263,7 +208,7 @@ class TestSuiteConfigFile(fixtures.TestCommon):
 
         new = {'XDG_CONFIG_HOME': str(self.config_root)}
         with patch.dict('os.environ', new):
-            imp.reload(glymur.lib.openjp2)
+            importlib.reload(glymur.lib.openjp2)
             Jp2k(self.jp2file)
 
     def test_config_file_without_library_section(self):
@@ -279,7 +224,7 @@ class TestSuiteConfigFile(fixtures.TestCommon):
 
         new = {'XDG_CONFIG_HOME': str(self.config_root)}
         with patch.dict('os.environ', new):
-            imp.reload(glymur.lib.openjp2)
+            importlib.reload(glymur.lib.openjp2)
             # It's enough that we did not error out
             self.assertTrue(True)
 
@@ -294,37 +239,26 @@ class TestSuiteConfigFile(fixtures.TestCommon):
 
         new = {'XDG_CONFIG_HOME': str(self.config_root)}
         with patch.dict('os.environ', new):
-            imp.reload(glymur.lib.openjp2)
+            importlib.reload(glymur.lib.openjp2)
             self.assertIsNotNone(glymur.lib.openjp2.OPENJP2)
 
-    @unittest.skipIf(platform.system() == 'Windows',
-                     'Symlinks require elevated privs on Windows, GH#505')
-    @unittest.skipIf(platform.system() == 'Linux' and sys.prefix == '/usr',
-                     'Difficult to run on Linux unless Anaconda, GH#496')
     def test_config_file_in_current_directory(self):
         """
         SCENARIO:  A configuration file exists in the current directory.
 
-        EXPECTED RESULT:  openjp2 library is loaded normally.
+        EXPECTED RESULT:  the path to the specified openjp2 library is returned
         """
-        existing_library = glymur.lib.openjp2.OPENJP2._name
-
-        # Make a soft link from a fake library directory to the existing
-        # location.
         new_lib_dir = self.test_dir_path / 'lib'
         new_lib_dir.mkdir()
 
-        new_library_path = new_lib_dir / 'libopenjp2.dylib'
-        new_library_path.symlink_to(existing_library)
+        expected = new_lib_dir / 'libopenjp2.dylib'
 
         with self.config_file.open('wt') as f:
             f.write('[library]\n')
-            f.write(f'openjp2: {new_library_path}\n')
+            f.write(f'openjp2: {expected}\n')
 
         with chdir(self.glymur_configdir):
             # Should be able to load openjp2 as before.
-            imp.reload(glymur.lib.openjp2)
+            actual = glymur.config.read_config_file('openjp2')
 
-        actual = glymur.lib.openjp2.OPENJP2._name
-        expected = new_library_path
         self.assertEqual(actual, expected)


=====================================
tests/test_jp2k.py
=====================================
@@ -26,7 +26,7 @@ from lxml import etree as ET
 import numpy as np
 try:
     import skimage.data
-    import skimage.measure
+    import skimage.metrics
     _HAVE_SCIKIT_IMAGE = True
 except ModuleNotFoundError:
     _HAVE_SCIKIT_IMAGE = False
@@ -1104,6 +1104,7 @@ class TestJp2k(fixtures.TestCommon):
 
         self.assertEqual(j.layer, 0)
 
+    @unittest.skipIf(os.cpu_count() < 4, "makes no sense if 4 cores not there")
     def test_thread_support(self):
         """
         SCENARIO:  Set a non-default thread support value.
@@ -1124,6 +1125,7 @@ class TestJp2k(fixtures.TestCommon):
 
         self.assertTrue(delta1 < delta0)
 
+    @unittest.skipIf(os.cpu_count() < 4, "makes no sense if 4 cores not there")
     def test_thread_support_on_openjpeg_lt_220(self):
         """
         SCENARIO:  Set number of threads on openjpeg < 2.2.0
@@ -1134,6 +1136,7 @@ class TestJp2k(fixtures.TestCommon):
             with self.assertRaises(RuntimeError):
                 glymur.set_option('lib.num_threads', 4)
 
+    @unittest.skipIf(os.cpu_count() < 4, "makes no sense if 4 cores not there")
     @patch('glymur.lib.openjp2.has_thread_support')
     def test_thread_support_not_compiled_into_library(self, mock_ts):
         """
@@ -1226,6 +1229,24 @@ class TestJp2k_write(fixtures.MetadataBase):
         os.unlink(cls.single_channel_j2k)
         os.unlink(cls.single_channel_jp2)
 
+    @unittest.skipIf(os.cpu_count() < 2, "makes no sense if 2 cores not there")
+    def test_threads(self):
+        """
+        SCENARIO:  Attempt to encode with threading support.  This feature is
+        new as of openjpeg library version 2.4.0.
+
+        EXPECTED RESULT:  In library versions prior to 2.4.0, a warning is
+        issued.
+        """
+        glymur.set_option('lib.num_threads', 2)
+        with open(self.temp_jp2_filename, mode='wb') as tfile:
+            with warnings.catch_warnings(record=True) as w:
+                Jp2k(tfile.name, data=self.jp2_data)
+                if glymur.version.openjpeg_version >= '2.4.0':
+                    self.assertEqual(len(w), 0)
+                else:
+                    self.assertEqual(len(w), 1)
+
     def test_no_jp2c_box_in_outermost_jp2_list(self):
         """
         SCENARIO:  A JP2 file is encountered without a JP2C box in the outer-
@@ -1307,7 +1328,9 @@ class TestJp2k_write(fixtures.MetadataBase):
             # warning
             warnings.simplefilter('ignore')
             psnr = [
-                skimage.measure.compare_psnr(skimage.data.camera(), d[j])
+                skimage.metrics.peak_signal_noise_ratio(
+                    skimage.data.camera(), d[j]
+                )
                 for j in range(4)
             ]
 
@@ -2343,9 +2366,22 @@ class TestReadArea(unittest.TestCase):
         self.assertEqual(ssdata.shape, (1, 1, 3))
 
     def test_NR_DEC_p1_06_j2k_75_decode(self):
-        # Image size would be 0 x 0.
-        with self.assertRaises(InvalidJp2kError):
-            self.j2k[9:12:4, 9:12:4]
+        """
+        SCENARIO:  Try to read an image area with an impossible stride.
+
+        EXPECTED RESULT:  An error is raised.
+        """
+        if glymur.version.openjpeg_version >= '2.4.0':
+            # The library catches this on its own.
+            expected_error = glymur.lib.openjp2.OpenJPEGLibraryError
+        else:
+            # Image size would be 0 x 0.  We have to manually detect this.
+            expected_error = InvalidJp2kError
+        with self.assertRaises(expected_error):
+            with warnings.catch_warnings():
+                # Only openjpeg 2.4.0 issues warnings
+                warnings.simplefilter('ignore')
+                self.j2k[9:12:4, 9:12:4]
 
     def test_NR_DEC_p0_04_j2k_85_decode(self):
         actual = self.j2k[:256, :256]


=====================================
tests/test_openjp2.py
=====================================
@@ -175,6 +175,12 @@ class TestOpenJP2(fixtures.TestCommon):
         xtx5_setup(filename)
         self.assertTrue(True)
 
+    def test_tte5_short_write_tile_signature(self):
+        """Runs test designated tte5 in OpenJPEG test suite."""
+        filename = str(self.temp_j2k_filename)
+        xtx5_setup(filename, short_sig=True)
+        self.assertTrue(True)
+
 
 def tile_encoder(**kwargs):
     """Fixture used by many tests."""
@@ -243,7 +249,10 @@ def tile_encoder(**kwargs):
     openjp2.start_compress(codec, l_image, stream)
 
     for j in np.arange(num_tiles):
-        openjp2.write_tile(codec, j, data, tile_size, stream)
+        if 'short_sig' in kwargs and kwargs['short_sig']:
+            openjp2.write_tile(codec, j, data, stream)
+        else:
+            openjp2.write_tile(codec, j, data, tile_size, stream)
 
     openjp2.end_compress(codec, stream)
     openjp2.stream_destroy(stream)
@@ -352,17 +361,20 @@ def xtx4_setup(filename):
     tile_encoder(**kwargs)
 
 
-def xtx5_setup(filename):
+def xtx5_setup(filename, short_sig=False):
     """Runs tests rta5, tte5."""
-    kwargs = {'filename': filename,
-              'codec': openjp2.CODEC_J2K,
-              'comp_prec': 8,
-              'irreversible': 0,
-              'num_comps': 1,
-              'image_height': 512,
-              'image_width': 512,
-              'tile_height': 256,
-              'tile_width': 256}
+    kwargs = {
+        'filename': filename,
+        'codec': openjp2.CODEC_J2K,
+        'comp_prec': 8,
+        'irreversible': 0,
+        'num_comps': 1,
+        'image_height': 512,
+        'image_width': 512,
+        'tile_height': 256,
+        'tile_width': 256,
+        'short_sig': short_sig
+    }
     tile_encoder(**kwargs)
 
 


=====================================
tests/test_printing.py
=====================================
@@ -1667,8 +1667,9 @@ class TestJp2dump(unittest.TestCase):
             '''    sgnd: 0\n'''
             '''    resno_decoded: 0\n'''
             '''    factor: 0\n'''
-            '''    data: <glymur.lib.openjp2.LP_c_(int|long) object at '''
-            '''0x[a-fA-F0-9]+>\n'''
+            '''    data: '''
+            '''<(glymur.lib.openjp2|ctypes.wintypes).LP_c_(int|long) '''
+            '''object at 0x[a-fA-F0-9]+>\n'''
             '''    alpha: 0\n'''
         )
         self.assertRegex(actual, expected)



View it on GitLab: https://salsa.debian.org/debian-gis-team/glymur/-/commit/c39de64abb5342cc026f360b2995099aae4c835f

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/glymur/-/commit/c39de64abb5342cc026f360b2995099aae4c835f
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20210109/75ea4201/attachment-0001.html>


More information about the Pkg-grass-devel mailing list