Glymur 0.14.1.post1__tar.gz → 0.14.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. {glymur-0.14.1.post1 → glymur-0.14.4}/.circleci/config.yml +6 -0
  2. {glymur-0.14.1.post1 → glymur-0.14.4}/CHANGES.txt +15 -2
  3. {glymur-0.14.1.post1 → glymur-0.14.4}/Glymur.egg-info/PKG-INFO +2 -1
  4. {glymur-0.14.1.post1 → glymur-0.14.4}/Glymur.egg-info/SOURCES.txt +2 -0
  5. {glymur-0.14.1.post1 → glymur-0.14.4}/PKG-INFO +2 -1
  6. {glymur-0.14.1.post1 → glymur-0.14.4}/appveyor.yml +6 -0
  7. {glymur-0.14.1.post1 → glymur-0.14.4}/ci/install.ps1 +2 -0
  8. {glymur-0.14.1.post1 → glymur-0.14.4}/ci/travis-311-no-gdal.yaml +3 -3
  9. {glymur-0.14.1.post1 → glymur-0.14.4}/ci/travis-311-no-opj.yaml +3 -3
  10. {glymur-0.14.1.post1 → glymur-0.14.4}/ci/travis-311.yaml +3 -3
  11. {glymur-0.14.1.post1 → glymur-0.14.4}/ci/travis-313.yaml +3 -3
  12. glymur-0.14.4/ci/travis-314.yaml +13 -0
  13. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/conf.py +1 -1
  14. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/how_do_i.rst +1 -1
  15. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/introduction.rst +1 -1
  16. glymur-0.14.4/docs/source/whatsnew/0.14.rst +45 -0
  17. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/_core_converter.py +1 -1
  18. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/jp2box.py +1 -1
  19. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/jp2k.py +9 -9
  20. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/jp2kr.py +18 -31
  21. glymur-0.14.4/glymur/lib/tiff.py +10 -0
  22. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/options.py +3 -4
  23. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/tiff.py +2 -2
  24. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/version.py +2 -2
  25. {glymur-0.14.1.post1 → glymur-0.14.4}/pyproject.toml +2 -1
  26. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_callbacks.py +1 -1
  27. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_commandline_tiff2jp2.py +1 -1
  28. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_jp2k.py +2 -2
  29. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_jp2k_writes.py +4 -2
  30. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_jp2kr.py +2 -2
  31. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_libtiff.py +1 -1
  32. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_printing.py +31 -28
  33. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_threading.py +13 -19
  34. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_tiff2jp2.py +1 -1
  35. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_warnings.py +0 -6
  36. glymur-0.14.1.post1/docs/source/whatsnew/0.14.rst +0 -26
  37. {glymur-0.14.1.post1 → glymur-0.14.4}/.gitignore +0 -0
  38. {glymur-0.14.1.post1 → glymur-0.14.4}/.readthedocs.yaml +0 -0
  39. {glymur-0.14.1.post1 → glymur-0.14.4}/.travis.yml +0 -0
  40. {glymur-0.14.1.post1 → glymur-0.14.4}/Glymur.egg-info/dependency_links.txt +0 -0
  41. {glymur-0.14.1.post1 → glymur-0.14.4}/Glymur.egg-info/entry_points.txt +0 -0
  42. {glymur-0.14.1.post1 → glymur-0.14.4}/Glymur.egg-info/requires.txt +0 -0
  43. {glymur-0.14.1.post1 → glymur-0.14.4}/Glymur.egg-info/top_level.txt +0 -0
  44. {glymur-0.14.1.post1 → glymur-0.14.4}/LICENSE.txt +0 -0
  45. {glymur-0.14.1.post1 → glymur-0.14.4}/MANIFEST.in +0 -0
  46. {glymur-0.14.1.post1 → glymur-0.14.4}/README.md +0 -0
  47. {glymur-0.14.1.post1 → glymur-0.14.4}/azure-pipelines.yml +0 -0
  48. {glymur-0.14.1.post1 → glymur-0.14.4}/ci/doc.yml +0 -0
  49. {glymur-0.14.1.post1 → glymur-0.14.4}/ci/run_script.sh +0 -0
  50. {glymur-0.14.1.post1 → glymur-0.14.4}/ci/run_with_env.cmd +0 -0
  51. {glymur-0.14.1.post1 → glymur-0.14.4}/ci/setup_env.sh +0 -0
  52. {glymur-0.14.1.post1 → glymur-0.14.4}/ci/travis-312.yaml +0 -0
  53. {glymur-0.14.1.post1 → glymur-0.14.4}/conftest.py +0 -0
  54. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/Makefile +0 -0
  55. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/make.bat +0 -0
  56. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/requirements.txt +0 -0
  57. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/api.rst +0 -0
  58. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/detailed_installation.rst +0 -0
  59. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/goodstuff_alpha.png +0 -0
  60. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/index.rst +0 -0
  61. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/roadmap.rst +0 -0
  62. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/whatsnew/0.10.rst +0 -0
  63. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/whatsnew/0.11.rst +0 -0
  64. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/whatsnew/0.12.rst +0 -0
  65. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/whatsnew/0.13.rst +0 -0
  66. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/whatsnew/0.5.rst +0 -0
  67. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/whatsnew/0.6.rst +0 -0
  68. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/whatsnew/0.7.rst +0 -0
  69. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/whatsnew/0.8.rst +0 -0
  70. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/whatsnew/0.9.rst +0 -0
  71. {glymur-0.14.1.post1 → glymur-0.14.4}/docs/source/whatsnew/index.rst +0 -0
  72. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/__init__.py +0 -0
  73. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/_iccprofile.py +0 -0
  74. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/codestream.py +0 -0
  75. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/command_line.py +0 -0
  76. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/config.py +0 -0
  77. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/core.py +0 -0
  78. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/data/__init__.py +0 -0
  79. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/data/goodstuff.j2k +0 -0
  80. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/data/heliov.jpx +0 -0
  81. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/data/nemo.jp2 +0 -0
  82. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/jpeg.py +0 -0
  83. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/lib/__init__.py +0 -0
  84. /glymur-0.14.1.post1/glymur/lib/tiff.py → /glymur-0.14.4/glymur/lib/_tiff.py +0 -0
  85. {glymur-0.14.1.post1 → glymur-0.14.4}/glymur/lib/openjp2.py +0 -0
  86. {glymur-0.14.1.post1 → glymur-0.14.4}/setup.cfg +0 -0
  87. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/__init__.py +0 -0
  88. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/__init__.py +0 -0
  89. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/conformance/__init__.py +0 -0
  90. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/conformance/file1_xml.txt +0 -0
  91. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/conformance/file1_xml_box.txt +0 -0
  92. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/conformance/p0_02.j2k +0 -0
  93. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/conformance/p0_03.j2k +0 -0
  94. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/conformance/p0_06.j2k +0 -0
  95. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/conformance/p1_06.j2k +0 -0
  96. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/conformance/p1_07.j2k +0 -0
  97. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/conformance/p1_07.txt +0 -0
  98. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/from-openjpeg/__init__.py +0 -0
  99. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/from-openjpeg/edf_c2_1178956.jp2 +0 -0
  100. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/from-openjpeg/issue142.j2k +0 -0
  101. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/from-openjpeg/issue392.jp2 +0 -0
  102. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/from-openjpeg/issue396.jp2 +0 -0
  103. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/from-openjpeg/issue438.jp2 +0 -0
  104. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/from-openjpeg/issue626.j2k +0 -0
  105. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/from-openjpeg/jph_siz.txt +0 -0
  106. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/from-openjpeg/oj-ht-byte.jph +0 -0
  107. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/from-openjpeg/text_GBR.jp2 +0 -0
  108. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/from-openjpeg/text_GBR_rreq.txt +0 -0
  109. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/geo/0220000800_uuid.dat +0 -0
  110. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/geo/__init__.py +0 -0
  111. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/geo/gml.xml +0 -0
  112. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/appended_xml_box.txt +0 -0
  113. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/countries.xml +0 -0
  114. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/decompression_parameters_type.txt +0 -0
  115. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/default_compression_parameters_type.txt +0 -0
  116. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/default_progression_order_changes_type.txt +0 -0
  117. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/encoding_declaration.xml +0 -0
  118. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/goodstuff_codestream_header.txt +0 -0
  119. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/goodstuff_with_full_header.txt +0 -0
  120. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/issue186_progression_order.txt +0 -0
  121. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/issue398.dat +0 -0
  122. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/issue405.dat +0 -0
  123. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/issue549.dat +0 -0
  124. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/issue555.xmp +0 -0
  125. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/issue982.j2k +0 -0
  126. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/multiple_precinct_size.txt +0 -0
  127. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/nemo.txt +0 -0
  128. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/nemo_dump_no_codestream.txt +0 -0
  129. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/nemo_dump_no_codestream_no_xml.txt +0 -0
  130. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/nemo_dump_no_xml.txt +0 -0
  131. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/nemo_dump_short.txt +0 -0
  132. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/nemo_with_codestream_header.txt +0 -0
  133. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/nemo_xmp_box.txt +0 -0
  134. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/no_jp2c.jp2 +0 -0
  135. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/sgray.icc +0 -0
  136. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/simple_rdf.txt +0 -0
  137. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/simple_rdf.uuid-box.txt +0 -0
  138. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/misc/uint16.j2k +0 -0
  139. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/__init__.py +0 -0
  140. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/astronaut8.tif +0 -0
  141. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/astronaut8_stripped.tif +0 -0
  142. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/astronaut_s_uint16.tif +0 -0
  143. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/astronaut_uint16.tif +0 -0
  144. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/astronaut_ycbcr_jpeg_tiled.tif +0 -0
  145. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/goodstuff_32s.tif +0 -0
  146. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/moon.tif +0 -0
  147. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/moon3_partial_last_strip.tif +0 -0
  148. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/moon3_stripped.tif +0 -0
  149. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/moon63.tif +0 -0
  150. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/moon_2x2.tif +0 -0
  151. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/moon_3x3.tif +0 -0
  152. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/stripped.tif +0 -0
  153. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/ycbcr_bg.tif +0 -0
  154. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/skimage/ycbcr_stripped.tif +0 -0
  155. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/tiff/__init__.py +0 -0
  156. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/tiff/albers27-8.tif +0 -0
  157. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/tiff/albers27.tif +0 -0
  158. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/tiff/basn6a08.tif +0 -0
  159. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/tiff/cmyk.tif +0 -0
  160. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/tiff/degenerate_geotiff.tif +0 -0
  161. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/tiff/flower-separated-planar-08.tif +0 -0
  162. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/tiff/ieeefp32.tif +0 -0
  163. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/tiff/issue572.tif +0 -0
  164. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/tiff/issue678.tif +0 -0
  165. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/tiff/uint32.tif +0 -0
  166. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/data/tiff/warning.tif +0 -0
  167. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/fixtures.py +0 -0
  168. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_cinema.py +0 -0
  169. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_codestream.py +0 -0
  170. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_colour_specification_box.py +0 -0
  171. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_commandline_jp2dump.py +0 -0
  172. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_commandline_jpeg2jp2.py +0 -0
  173. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_config.py +0 -0
  174. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_geo.py +0 -0
  175. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_jp2box.py +0 -0
  176. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_jp2box_jpx.py +0 -0
  177. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_jp2box_uuid.py +0 -0
  178. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_jp2box_xml.py +0 -0
  179. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_jpeg2jp2.py +0 -0
  180. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_openjp2.py +0 -0
  181. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_set_decoded_components.py +0 -0
  182. {glymur-0.14.1.post1 → glymur-0.14.4}/tests/test_slicing.py +0 -0
@@ -11,6 +11,7 @@ workflows:
11
11
  - travis-311
12
12
  - travis-312
13
13
  - travis-313
14
+ - travis-314
14
15
 
15
16
  test-template: &test-template
16
17
  docker:
@@ -42,6 +43,8 @@ test-template: &test-template
42
43
  export PATH=$HOME/miniconda/bin:$PATH
43
44
  source activate glymur
44
45
  pytest -n 4 -x
46
+ pytest --doctest-glob='*.rst' docs/source/how_do_i.rst
47
+ pytest --doctest-modules glymur
45
48
 
46
49
  jobs:
47
50
  travis-311-no-gdal:
@@ -58,3 +61,6 @@ jobs:
58
61
 
59
62
  travis-313:
60
63
  <<: *test-template
64
+
65
+ travis-314:
66
+ <<: *test-template
@@ -1,5 +1,18 @@
1
- Apr 06, 2025 - v0.14.1post1
2
- Fix pyproject.toml for pillow, not PIL
1
+ Oct 08, 2025 - v0.14.4
2
+ Qualify on python 3.14
3
+ Add User-Agent header to powershell script for Appveyor
4
+ Remove remaining openjpeg<2.4 artifacts
5
+ Remove explicit testing of numpy 1.26
6
+
7
+ Jun 12, 2025 - v0.14.3
8
+ Fix DeprecationWarning upon import
9
+
10
+ Jun 12, 2025 - v0.14.2
11
+ Fix test suite for python 3.14 regular expressions
12
+ Remove long-since-deprecated Jp2kr.read method
13
+ Make Jp2kr.parse method private
14
+ Make glymur.lib.tiff module private
15
+ Add doctests into circleci config
3
16
 
4
17
  Apr 06, 2025 - v0.14.1
5
18
  Fix doc builds for API
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Glymur
3
- Version: 0.14.1.post1
3
+ Version: 0.14.4
4
4
  Summary: Read and write JPEG 2000 files
5
5
  Author-email: John Evans <jevans667cc@proton.me>
6
6
  License-Expression: MIT
@@ -12,6 +12,7 @@ Classifier: Programming Language :: Python
12
12
  Classifier: Programming Language :: Python :: 3.11
13
13
  Classifier: Programming Language :: Python :: 3.12
14
14
  Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Programming Language :: Python :: 3.14
15
16
  Classifier: Programming Language :: Python :: Implementation :: CPython
16
17
  Classifier: Intended Audience :: Science/Research
17
18
  Classifier: Operating System :: OS Independent
@@ -26,6 +26,7 @@ ci/travis-311-no-opj.yaml
26
26
  ci/travis-311.yaml
27
27
  ci/travis-312.yaml
28
28
  ci/travis-313.yaml
29
+ ci/travis-314.yaml
29
30
  docs/Makefile
30
31
  docs/make.bat
31
32
  docs/requirements.txt
@@ -67,6 +68,7 @@ glymur/data/goodstuff.j2k
67
68
  glymur/data/heliov.jpx
68
69
  glymur/data/nemo.jp2
69
70
  glymur/lib/__init__.py
71
+ glymur/lib/_tiff.py
70
72
  glymur/lib/openjp2.py
71
73
  glymur/lib/tiff.py
72
74
  tests/__init__.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Glymur
3
- Version: 0.14.1.post1
3
+ Version: 0.14.4
4
4
  Summary: Read and write JPEG 2000 files
5
5
  Author-email: John Evans <jevans667cc@proton.me>
6
6
  License-Expression: MIT
@@ -12,6 +12,7 @@ Classifier: Programming Language :: Python
12
12
  Classifier: Programming Language :: Python :: 3.11
13
13
  Classifier: Programming Language :: Python :: 3.12
14
14
  Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Programming Language :: Python :: 3.14
15
16
  Classifier: Programming Language :: Python :: Implementation :: CPython
16
17
  Classifier: Intended Audience :: Science/Research
17
18
  Classifier: Operating System :: OS Independent
@@ -30,6 +30,12 @@ environment:
30
30
  CONDA_PY: "313"
31
31
  USE_PATH_FOR_GDAL_PYTHON: "YES"
32
32
 
33
+ - CONDA_ROOT: "C:\\Miniconda3_64"
34
+ PYTHON_VERSION: "3.14"
35
+ PYTHON_ARCH: "64"
36
+ CONDA_PY: "314"
37
+ USE_PATH_FOR_GDAL_PYTHON: "YES"
38
+
33
39
  # We always use a 64-bit machine, but can build x86 distributions
34
40
  # with the PYTHON_ARCH variable (which is used by CMD_IN_ENV).
35
41
  platform:
@@ -7,6 +7,8 @@ $MINICONDA_URL = "http://repo.continuum.io/miniconda/"
7
7
 
8
8
  function DownloadMiniconda ($python_version, $platform_suffix) {
9
9
  $webclient = New-Object System.Net.WebClient
10
+ $webclient.Headers.Add("User-Agent", "Abraxis/1.0")
11
+
10
12
  $filename = "Miniconda3-latest-Windows-" + $platform_suffix + ".exe"
11
13
  $url = $MINICONDA_URL + $filename
12
14
 
@@ -3,11 +3,11 @@ channels:
3
3
  - conda-forge
4
4
  dependencies:
5
5
  - python=3.11.*
6
- - gdal>=3.7.0,<3.8.0
6
+ - gdal>=3.8.0,<3.9.0
7
7
  - pillow
8
- - libtiff>=4.5.0,<4.6.0
8
+ - libtiff>=4.6.0,<4.7.0
9
9
  - lxml>=5.0
10
- - numpy>=1.26,<2.0
10
+ - numpy>=2.0,<2.1
11
11
  - openjpeg>=2.5
12
12
  - pytest-xdist
13
13
  - scikit-image
@@ -3,11 +3,11 @@ channels:
3
3
  - conda-forge
4
4
  dependencies:
5
5
  - python=3.11.*
6
- - gdal>=3.7.0,<3.8.0
6
+ - gdal>=3.8.0,<3.9.0
7
7
  - pillow
8
- - libtiff>=4.5.0,<4.6.0
8
+ - libtiff>=4.6.0,<4.7.0
9
9
  - lxml>=5.0
10
- - numpy>=1.26,<2.0
10
+ - numpy>=2.0,<2.1
11
11
  - pip
12
12
  - pytest-xdist
13
13
  - scikit-image
@@ -3,11 +3,11 @@ channels:
3
3
  - conda-forge
4
4
  dependencies:
5
5
  - python=3.11.*
6
- - gdal>=3.7.0,<3.8.0
6
+ - gdal>=3.8.0,<3.9.0
7
7
  - pillow
8
- - libtiff>=4.5.0,<4.6.0
8
+ - libtiff>=4.6.0,<4.7.0
9
9
  - lxml>=5.0
10
- - numpy>=1.26,<2.0
10
+ - numpy>=2.0,<2.1
11
11
  - openjpeg>=2.5
12
12
  - pytest-xdist
13
13
  - scikit-image
@@ -6,8 +6,8 @@ dependencies:
6
6
  - gdal>=3.10.0,<3.11.0
7
7
  - pillow
8
8
  - libtiff>=4.7.0,<4.8.0
9
- - lxml>=5.3.0
10
- - numpy>=2.1
11
- - openjpeg>=2.5
9
+ - lxml>=5.3.0,<6.0.0
10
+ - numpy>=2.1,<2.3.3
11
+ - openjpeg>=2.5.3,<2.5.4
12
12
  - pytest-xdist
13
13
  - scikit-image
@@ -0,0 +1,13 @@
1
+ name: glymur
2
+ channels:
3
+ - conda-forge
4
+ dependencies:
5
+ - python>=3.14.0
6
+ - gdal>=3.11.0
7
+ - pillow
8
+ - libtiff>=4.7.1
9
+ - lxml>=6.0.2
10
+ - numpy>=2.3.3
11
+ - openjpeg>=2.5.4
12
+ - pytest-xdist
13
+ - scikit-image
@@ -81,7 +81,7 @@ copyright = '2013-2025, John Evans'
81
81
  # The short X.Y version.
82
82
  version = '0.14'
83
83
  # The full version, including alpha/beta/rc tags.
84
- release = '0.14.1post1'
84
+ release = '0.14.4'
85
85
 
86
86
  # The language for content autogenerated by Sphinx. Refer to documentation
87
87
  # for a list of supported languages.
@@ -771,7 +771,7 @@ are wrapped in a BytesIO object, which is fed to the most-excellent Pillow packa
771
771
  >>> from PIL import ImageCms
772
772
  >>> from io import BytesIO
773
773
  >>> # this assumes you have access to the test suite
774
- >>> p = pathlib.Path('tests/data/text_GBR.jp2')
774
+ >>> p = pathlib.Path('tests/data/from-openjpeg/text_GBR.jp2')
775
775
  >>> # This next step may produce a harmless warning that has nothing to do with ICC profiles.
776
776
  >>> j = Jp2k(p)
777
777
  >>> # The 2nd sub box of the 4th box is a ColourSpecification box.
@@ -13,7 +13,7 @@ Certain optional JP2 boxes can also be written, including XML boxes and
13
13
  XMP UUIDs. There is incomplete support for reading JPX metadata.
14
14
 
15
15
  The current version of glymur is supported on Python versions 3.11,
16
- 3.12, and 3.13. You should have at least version 2.4.0 of OpenJPEG.
16
+ 3.12, 3.13, and 3.14. You should have at least version 2.4.0 of OpenJPEG.
17
17
 
18
18
  For more information about OpenJPEG, please consult http://www.openjpeg.org.
19
19
 
@@ -0,0 +1,45 @@
1
+ ######################
2
+ Changes in glymur 0.14
3
+ ######################
4
+
5
+ *****************
6
+ Changes in 0.14.4
7
+ *****************
8
+
9
+ * Qualify on python 3.14
10
+ * Add User-Agent header to powershell script for Appveyor
11
+ * Remove remaining openjpeg<2.4 artifacts
12
+ * Remove explicit testing of numpy 1.x
13
+
14
+ *****************
15
+ Changes in 0.14.3
16
+ *****************
17
+
18
+ * Fix import warning
19
+
20
+ *****************
21
+ Changes in 0.14.2
22
+ *****************
23
+
24
+ * Fix test suite for python 3.14 regular expressions
25
+ * Remove long-since-deprecated Jp2kr.read method
26
+ * Make Jp2kr.parse method private
27
+ * Make glymur.lib.tiff module private
28
+ * Add doctests into circleci config
29
+
30
+ *****************
31
+ Changes in 0.14.1
32
+ *****************
33
+
34
+ * Fix doc builds for API
35
+ * Add additional API examples for Jp2k, Jp2kr
36
+ * Fix tilesize reporting
37
+ * Refactor all of setup.cfg into pyproject.toml
38
+
39
+ *****************
40
+ Changes in 0.14.0
41
+ *****************
42
+
43
+ * Add description of raw IFD for geojp2 UUIDs
44
+ * Add feature to convert JPEGs to JP2
45
+ * Remove support for python 3.10
@@ -9,7 +9,7 @@ from uuid import UUID
9
9
 
10
10
  # local imports
11
11
  from . import jp2box
12
- from .lib.tiff import DATATYPE2FMT
12
+ from .lib._tiff import DATATYPE2FMT
13
13
  from .jp2k import Jp2k
14
14
  from glymur.core import RESTRICTED_ICC_PROFILE
15
15
 
@@ -51,7 +51,7 @@ from .core import (
51
51
  ANY_ICC_PROFILE,
52
52
  VENDOR_COLOR_METHOD,
53
53
  )
54
- from .lib.tiff import tiff_header, BadTiffTagDatatype
54
+ from .lib._tiff import tiff_header, BadTiffTagDatatype
55
55
  from . import get_option
56
56
  from ._iccprofile import _ICCProfile
57
57
 
@@ -216,7 +216,7 @@ class Jp2k(Jp2kr):
216
216
  force : bool
217
217
  If true, then run finalize operations
218
218
  """
219
- self.parse(force=force_parse)
219
+ self._parse(force=force_parse)
220
220
 
221
221
  if (
222
222
  self._capture_resolution is None
@@ -256,7 +256,7 @@ class Jp2k(Jp2kr):
256
256
  temp_filename = self.filename + ".tmp"
257
257
  self.wrap(temp_filename, boxes=self.box)
258
258
  shutil.move(temp_filename, self.filename)
259
- self.parse(force=True)
259
+ self._parse(force=True)
260
260
 
261
261
  def _validate_kwargs(self):
262
262
  """Validate keyword parameters passed to the constructor."""
@@ -526,10 +526,10 @@ class Jp2k(Jp2kr):
526
526
  This method can only be used to create JPEG 2000 images that can fit
527
527
  in memory.
528
528
  """
529
- if version.openjpeg_version < "2.3.0":
529
+ if version.openjpeg_version < "2.4.0":
530
530
  msg = (
531
- "You must have at least version 2.3.0 of OpenJPEG in order to "
532
- "write images."
531
+ "The minimum supported version of OpenJPEG is 2.4.0. "
532
+ f"Your version is {version.openjpeg_version}."
533
533
  )
534
534
  raise RuntimeError(msg)
535
535
 
@@ -817,7 +817,7 @@ class Jp2k(Jp2kr):
817
817
  with self.path.open("ab") as ofile:
818
818
  box.write(ofile)
819
819
 
820
- self.parse(force=True)
820
+ self._parse(force=True)
821
821
 
822
822
  def wrap(self, filename, boxes=None):
823
823
  """
@@ -1463,10 +1463,10 @@ class _TileWriter(object):
1463
1463
  """Write image data to a JP2/JPX/J2k file. Intended usage of the
1464
1464
  various parameters follows that of OpenJPEG's opj_compress utility.
1465
1465
  """
1466
- if version.openjpeg_version < "2.3.0":
1466
+ if version.openjpeg_version < "2.4.0":
1467
1467
  msg = (
1468
- "You must have at least version 2.3.0 of OpenJPEG "
1469
- "in order to write images."
1468
+ "The minimum supported version of OpenJPEG is 2.4.0. "
1469
+ f"Your version is {version.openjpeg_version}."
1470
1470
  )
1471
1471
  raise RuntimeError(msg)
1472
1472
 
@@ -12,7 +12,6 @@ from __future__ import annotations
12
12
  from contextlib import ExitStack
13
13
  import ctypes
14
14
  import pathlib
15
- import re
16
15
  import struct
17
16
  import sys
18
17
  import warnings
@@ -107,7 +106,7 @@ class Jp2kr(Jp2kBox):
107
106
  if not self.path.exists():
108
107
  raise FileNotFoundError(f"{self.filename} does not exist.")
109
108
 
110
- self.parse()
109
+ self._parse()
111
110
  self._initialize_shape()
112
111
 
113
112
  def _initialize_shape(self):
@@ -393,6 +392,15 @@ class Jp2kr(Jp2kBox):
393
392
  return "\n".join(metadata)
394
393
 
395
394
  def parse(self, force=False):
395
+ """
396
+ .. deprecated:: 0.15.0
397
+ """
398
+ breakpoint()
399
+ msg = "Deprecated, do not use."
400
+ warnings.warn(msg, DeprecationWarning)
401
+ self._parse(force=force)
402
+
403
+ def _parse(self, force=False):
396
404
  """Parses the JPEG 2000 file.
397
405
 
398
406
  Parameters
@@ -633,25 +641,6 @@ class Jp2kr(Jp2kBox):
633
641
  # Ok, 3 arguments in pargs.
634
642
  return data[:, :, bands]
635
643
 
636
- def read(self, **kwargs):
637
- """Read a JPEG 2000 image.
638
-
639
- .. deprecated:: 0.13.5
640
- Use numpy-style slicing instead.
641
-
642
- Returns
643
- -------
644
- img_array : ndarray
645
- The image data.
646
- """
647
-
648
- if "ignore_pclr_cmap_cdef" in kwargs:
649
- self.ignore_pclr_cmap_cdef = kwargs["ignore_pclr_cmap_cdef"]
650
- kwargs.pop("ignore_pclr_cmap_cdef")
651
- warnings.warn("Use array-style slicing instead.", DeprecationWarning)
652
- img = self._read(**kwargs)
653
- return img
654
-
655
644
  def _subsampling_sanity_check(self):
656
645
  """Check for differing subsample factors."""
657
646
  if self._decoded_components is None:
@@ -704,11 +693,10 @@ class Jp2kr(Jp2kBox):
704
693
  RuntimeError
705
694
  If the image has differing subsample factors.
706
695
  """
707
- if re.match("0|1|2.[012]", version.openjpeg_version):
696
+ if version.openjpeg_version < '2.4.0':
708
697
  msg = (
709
- f"You must have a version of OpenJPEG at least as high as "
710
- f"2.3.0 before you can read JPEG2000 images with glymur. "
711
- f"Your version is {version.openjpeg_version}"
698
+ "The minimum supported version of OpenJPEG is 2.4.0. "
699
+ f"Your version is {version.openjpeg_version}."
712
700
  )
713
701
  raise RuntimeError(msg)
714
702
 
@@ -854,7 +842,7 @@ class Jp2kr(Jp2kBox):
854
842
 
855
843
  The only time you should ever use this method is when the image has
856
844
  different subsampling factors across components. Otherwise you should
857
- use the read method.
845
+ use numpy-style slicing.
858
846
 
859
847
  Parameters
860
848
  ----------
@@ -888,11 +876,10 @@ class Jp2kr(Jp2kBox):
888
876
  >>> jp = glymur.Jp2k(jfile)
889
877
  >>> components_lst = jp.read_bands(rlevel=1)
890
878
  """
891
- if version.openjpeg_version < "2.3.0":
879
+ if version.openjpeg_version < "2.4.0":
892
880
  msg = (
893
- f"You must have at least version 2.3.0 of OpenJPEG installed "
894
- f"before using this method. Your version of OpenJPEG is "
895
- f"{version.openjpeg_version}."
881
+ "The minimum supported version of OpenJPEG is 2.4.0. "
882
+ f"Your version is {version.openjpeg_version}."
896
883
  )
897
884
  raise RuntimeError(msg)
898
885
 
@@ -966,7 +953,7 @@ class Jp2kr(Jp2kBox):
966
953
  return image
967
954
 
968
955
  def _component2dtype(self, component):
969
- """Determin the appropriate numpy datatype for an OpenJPEG component.
956
+ """Determine the appropriate numpy datatype for an OpenJPEG component.
970
957
 
971
958
  Parameters
972
959
  ----------
@@ -0,0 +1,10 @@
1
+ """
2
+ This module is deprecated. No external use, please.
3
+ """
4
+ # standard library imports
5
+ import warnings
6
+
7
+ from ._tiff import * # noqa : F401, F403
8
+
9
+ msg = "glymur.lib.tiff is for internal use only. Please do not use it."
10
+ warnings.warn(msg, DeprecationWarning)
@@ -71,11 +71,10 @@ def set_option(key, value):
71
71
  raise KeyError(f"{key} not valid.")
72
72
 
73
73
  if key == "lib.num_threads":
74
- if version.openjpeg_version < "2.2.0":
74
+ if version.openjpeg_version < "2.4.0":
75
75
  msg = (
76
- f"Thread support is not available on versions of OpenJPEG "
77
- f"prior to 2.2.0. Your version is "
78
- f"{version.openjpeg_version}."
76
+ "The minimum supported version of OpenJPEG is 2.4.0. "
77
+ f"Your version is {version.openjpeg_version}."
79
78
  )
80
79
  raise RuntimeError(msg)
81
80
  if not opj2.has_thread_support():
@@ -14,7 +14,7 @@ import numpy as np
14
14
  from glymur import Jp2k, set_option
15
15
  from glymur.core import SRGB
16
16
  from ._core_converter import _2JP2Converter
17
- from .lib import tiff as libtiff
17
+ from .lib import _tiff as libtiff
18
18
  from . import jp2box
19
19
 
20
20
  # we need a lower case mapping from the tag name to the tag number
@@ -243,7 +243,7 @@ class Tiff2Jp2k(_2JP2Converter):
243
243
  temp_filename = str(self.jp2_path) + ".tmp"
244
244
  self.jp2.wrap(temp_filename, boxes=self.jp2.box)
245
245
  shutil.move(temp_filename, self.jp2_path)
246
- self.jp2.parse()
246
+ self.jp2._parse()
247
247
 
248
248
  def append_extra_jp2_boxes(self):
249
249
  """Copy over the TIFF IFD. Place it in a UUID box. Append to the JPEG
@@ -16,11 +16,11 @@ import numpy as np
16
16
 
17
17
  # Local imports ...
18
18
  from .lib import openjp2 as opj2
19
- from .lib import tiff
19
+ from .lib import _tiff as tiff
20
20
 
21
21
  # Do not change the format of this next line! Doing so risks breaking
22
22
  # setup.py
23
- version = "0.14.1post1"
23
+ version = "0.14.4"
24
24
 
25
25
  version_tuple = parse(version).release
26
26
 
@@ -5,6 +5,7 @@ classifiers = [
5
5
  'Programming Language :: Python :: 3.11',
6
6
  'Programming Language :: Python :: 3.12',
7
7
  'Programming Language :: Python :: 3.13',
8
+ 'Programming Language :: Python :: 3.14',
8
9
  'Programming Language :: Python :: Implementation :: CPython',
9
10
  'Intended Audience :: Science/Research',
10
11
  'Operating System :: OS Independent',
@@ -21,7 +22,7 @@ license = 'MIT'
21
22
  name = 'Glymur'
22
23
  readme = 'README.md'
23
24
  requires-python = '>=3.11'
24
- version = '0.14.1post1'
25
+ version = '0.14.4'
25
26
 
26
27
  [project.scripts]
27
28
  jp2dump = 'glymur.command_line:main'
@@ -33,7 +33,7 @@ class TestSuite(fixtures.TestCommon):
33
33
  with warnings.catch_warnings():
34
34
  # Ignore a library warning.
35
35
  warnings.simplefilter("ignore")
36
- tiledata = j.read(tile=0)
36
+ tiledata = j._read(tile=0)
37
37
 
38
38
  with patch("sys.stdout", new=StringIO()) as fake_out:
39
39
  glymur.Jp2k(self.temp_j2k_filename, data=tiledata, verbose=True)
@@ -428,7 +428,7 @@ class TestSuite(fixtures.TestCommon):
428
428
  """
429
429
  path = ir.files('tests.data.tiff').joinpath('basn6a08.tif')
430
430
  buffer = path.read_bytes()
431
- ifd = glymur.lib.tiff.tiff_header(buffer)
431
+ ifd = glymur.lib._tiff.tiff_header(buffer)
432
432
  icc_profile = bytes(ifd['ICCProfile'])
433
433
 
434
434
  sys.argv = [
@@ -368,7 +368,7 @@ class TestJp2k(fixtures.TestCommon):
368
368
  with warnings.catch_warnings():
369
369
  # Suppress the DeprecationWarning
370
370
  warnings.simplefilter("ignore")
371
- thumbnail1 = j.read(rlevel=-1)
371
+ thumbnail1 = j._read(rlevel=-1)
372
372
  thumbnail2 = j[::32, ::32]
373
373
  np.testing.assert_array_equal(thumbnail1, thumbnail2)
374
374
  self.assertEqual(thumbnail1.shape, (25, 15, 3))
@@ -975,7 +975,7 @@ class TestVersion(fixtures.TestCommon):
975
975
  with warnings.catch_warnings():
976
976
  # Suppress a deprecation warning for raw read method.
977
977
  warnings.simplefilter("ignore")
978
- glymur.Jp2k(self.jp2file).read()
978
+ glymur.Jp2k(self.jp2file)._read()
979
979
  with self.assertRaises(RuntimeError):
980
980
  glymur.Jp2k(self.jp2file)[:]
981
981
 
@@ -1546,7 +1546,8 @@ class TestSuite(fixtures.TestCommon):
1546
1546
  def test_ignore_pclr_cmap_cdef_on_old_read(self):
1547
1547
  """
1548
1548
  The old "read" interface allowed for passing ignore_pclr_cmap_cdef
1549
- to read a palette dataset "uninterpolated".
1549
+ to read a palette dataset "uninterpolated", but we have to
1550
+ use properties now.
1550
1551
  """
1551
1552
  jpx = Jp2k(self.jpxfile)
1552
1553
  jpx.ignore_pclr_cmap_cdef = True
@@ -1556,7 +1557,8 @@ class TestSuite(fixtures.TestCommon):
1556
1557
  with warnings.catch_warnings():
1557
1558
  # Ignore a deprecation warning.
1558
1559
  warnings.simplefilter('ignore')
1559
- actual = jpx2.read(ignore_pclr_cmap_cdef=True)
1560
+ jpx2.ignore_pclr_cmap_cdef = True
1561
+ actual = jpx2._read()
1560
1562
 
1561
1563
  np.testing.assert_array_equal(actual, expected)
1562
1564
 
@@ -276,7 +276,7 @@ class TestJp2kr(fixtures.TestCommon):
276
276
  with warnings.catch_warnings():
277
277
  # Suppress the DeprecationWarning
278
278
  warnings.simplefilter("ignore")
279
- thumbnail1 = j.read(rlevel=-1)
279
+ thumbnail1 = j._read(rlevel=-1)
280
280
  thumbnail2 = j[::32, ::32]
281
281
  np.testing.assert_array_equal(thumbnail1, thumbnail2)
282
282
  self.assertEqual(thumbnail1.shape, (25, 15, 3))
@@ -894,7 +894,7 @@ class TestVersion(fixtures.TestCommon):
894
894
  with warnings.catch_warnings():
895
895
  # Suppress a deprecation warning for raw read method.
896
896
  warnings.simplefilter("ignore")
897
- glymur.Jp2kr(self.jp2file).read()
897
+ glymur.Jp2kr(self.jp2file)._read()
898
898
  with self.assertRaises(RuntimeError):
899
899
  glymur.Jp2kr(self.jp2file)[:]
900
900
 
@@ -12,7 +12,7 @@ import skimage
12
12
 
13
13
  # local imports
14
14
  from . import fixtures
15
- from glymur.lib import tiff as libtiff
15
+ from glymur.lib import _tiff as libtiff
16
16
 
17
17
 
18
18
  @unittest.skipIf(