mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-11-10 19:56:47 +03:00
add version to features info block
This commit is contained in:
parent
11a4f1135d
commit
a324f4a466
|
@ -2,14 +2,14 @@ import io
|
|||
import sys
|
||||
|
||||
import pytest
|
||||
from PIL import IcnsImagePlugin, Image
|
||||
from PIL import IcnsImagePlugin, Image, features
|
||||
|
||||
from .helper import assert_image_equal, assert_image_similar
|
||||
|
||||
# sample icon file
|
||||
TEST_FILE = "Tests/images/pillow.icns"
|
||||
|
||||
ENABLE_JPEG2K = hasattr(Image.core, "jp2klib_version")
|
||||
ENABLE_JPEG2K = features.check_codec("jpg_2000")
|
||||
|
||||
|
||||
def test_sanity():
|
||||
|
|
|
@ -3,7 +3,7 @@ import re
|
|||
from io import BytesIO
|
||||
|
||||
import pytest
|
||||
from PIL import ExifTags, Image, ImageFile, JpegImagePlugin
|
||||
from PIL import ExifTags, Image, ImageFile, JpegImagePlugin, features
|
||||
|
||||
from .helper import (
|
||||
assert_image,
|
||||
|
@ -41,7 +41,7 @@ class TestFileJpeg:
|
|||
def test_sanity(self):
|
||||
|
||||
# internal version number
|
||||
assert re.search(r"\d+\.\d+$", Image.core.jpeglib_version)
|
||||
assert re.search(r"\d+\.\d+$", features.version_codec("jpg"))
|
||||
|
||||
with Image.open(TEST_FILE) as im:
|
||||
im.load()
|
||||
|
|
|
@ -2,7 +2,7 @@ import re
|
|||
from io import BytesIO
|
||||
|
||||
import pytest
|
||||
from PIL import Image, ImageFile, Jpeg2KImagePlugin
|
||||
from PIL import Image, ImageFile, Jpeg2KImagePlugin, features
|
||||
|
||||
from .helper import (
|
||||
assert_image_equal,
|
||||
|
@ -35,7 +35,7 @@ def roundtrip(im, **options):
|
|||
|
||||
def test_sanity():
|
||||
# Internal version number
|
||||
assert re.search(r"\d+\.\d+\.\d+$", Image.core.jp2klib_version)
|
||||
assert re.search(r"\d+\.\d+\.\d+$", features.version_codec("jpg_2000"))
|
||||
|
||||
with Image.open("Tests/images/test-card-lossless.jp2") as im:
|
||||
px = im.load()
|
||||
|
|
|
@ -3,7 +3,7 @@ import zlib
|
|||
from io import BytesIO
|
||||
|
||||
import pytest
|
||||
from PIL import Image, ImageFile, PngImagePlugin
|
||||
from PIL import Image, ImageFile, PngImagePlugin, features
|
||||
|
||||
from .helper import (
|
||||
PillowLeakTestCase,
|
||||
|
@ -73,7 +73,7 @@ class TestFilePng:
|
|||
def test_sanity(self, tmp_path):
|
||||
|
||||
# internal version number
|
||||
assert re.search(r"\d+\.\d+\.\d+(\.\d+)?$", Image.core.zlib_version)
|
||||
assert re.search(r"\d+\.\d+\.\d+(\.\d+)?$", features.version_codec("zlib"))
|
||||
|
||||
test_file = str(tmp_path / "temp.png")
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ import re
|
|||
from io import BytesIO
|
||||
|
||||
import pytest
|
||||
from PIL import Image, ImageMode
|
||||
from PIL import Image, ImageMode, features
|
||||
|
||||
from .helper import assert_image, assert_image_equal, assert_image_similar, hopper
|
||||
|
||||
|
@ -46,7 +46,7 @@ def test_sanity():
|
|||
assert list(map(type, v)) == [str, str, str, str]
|
||||
|
||||
# internal version number
|
||||
assert re.search(r"\d+\.\d+$", ImageCms.core.littlecms_version)
|
||||
assert re.search(r"\d+\.\d+$", features.version_module("littlecms2"))
|
||||
|
||||
skip_missing()
|
||||
i = ImageCms.profileToProfile(hopper(), SRGB, SRGB)
|
||||
|
|
|
@ -7,7 +7,7 @@ import sys
|
|||
from io import BytesIO
|
||||
|
||||
import pytest
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
from PIL import Image, ImageDraw, ImageFont, features
|
||||
|
||||
from .helper import (
|
||||
assert_image_equal,
|
||||
|
@ -40,7 +40,7 @@ class TestImageFont:
|
|||
|
||||
@classmethod
|
||||
def setup_class(self):
|
||||
freetype = distutils.version.StrictVersion(ImageFont.core.freetype2_version)
|
||||
freetype = distutils.version.StrictVersion(features.version_module("freetype2"))
|
||||
|
||||
self.metrics = self.METRICS["Default"]
|
||||
for conditions, metrics in self.METRICS.items():
|
||||
|
@ -67,7 +67,7 @@ class TestImageFont:
|
|||
)
|
||||
|
||||
def test_sanity(self):
|
||||
assert re.search(r"\d+\.\d+\.\d+$", ImageFont.core.freetype2_version)
|
||||
assert re.search(r"\d+\.\d+\.\d+$", features.version_module("freetype2"))
|
||||
|
||||
def test_font_properties(self):
|
||||
ttf = self.get_font()
|
||||
|
@ -619,7 +619,7 @@ class TestImageFont:
|
|||
def test_variation_get(self):
|
||||
font = self.get_font()
|
||||
|
||||
freetype = distutils.version.StrictVersion(ImageFont.core.freetype2_version)
|
||||
freetype = distutils.version.StrictVersion(features.version_module("freetype2"))
|
||||
if freetype < "2.9.1":
|
||||
with pytest.raises(NotImplementedError):
|
||||
font.get_variation_names()
|
||||
|
@ -691,7 +691,7 @@ class TestImageFont:
|
|||
def test_variation_set_by_name(self):
|
||||
font = self.get_font()
|
||||
|
||||
freetype = distutils.version.StrictVersion(ImageFont.core.freetype2_version)
|
||||
freetype = distutils.version.StrictVersion(features.version_module("freetype2"))
|
||||
if freetype < "2.9.1":
|
||||
with pytest.raises(NotImplementedError):
|
||||
font.set_variation_by_name("Bold")
|
||||
|
@ -715,7 +715,7 @@ class TestImageFont:
|
|||
def test_variation_set_by_axes(self):
|
||||
font = self.get_font()
|
||||
|
||||
freetype = distutils.version.StrictVersion(ImageFont.core.freetype2_version)
|
||||
freetype = distutils.version.StrictVersion(features.version_module("freetype2"))
|
||||
if freetype < "2.9.1":
|
||||
with pytest.raises(NotImplementedError):
|
||||
font.set_variation_by_axes([100])
|
||||
|
|
|
@ -23,10 +23,10 @@ import subprocess
|
|||
import sys
|
||||
import tempfile
|
||||
|
||||
from PIL import Image, ImageFile, PngImagePlugin
|
||||
from PIL import Image, ImageFile, PngImagePlugin, features
|
||||
from PIL._binary import i8
|
||||
|
||||
enable_jpeg2k = hasattr(Image.core, "jp2klib_version")
|
||||
enable_jpeg2k = features.check_codec("jpg_2000")
|
||||
if enable_jpeg2k:
|
||||
from PIL import Jpeg2KImagePlugin
|
||||
|
||||
|
|
|
@ -8,11 +8,11 @@ import PIL
|
|||
from . import Image
|
||||
|
||||
modules = {
|
||||
"pil": "PIL._imaging",
|
||||
"tkinter": "PIL._tkinter_finder",
|
||||
"freetype2": "PIL._imagingft",
|
||||
"littlecms2": "PIL._imagingcms",
|
||||
"webp": "PIL._webp",
|
||||
"pil": ("PIL._imaging", None),
|
||||
"tkinter": ("PIL._tkinter_finder", None),
|
||||
"freetype2": ("PIL._imagingft", "freetype2"),
|
||||
"littlecms2": ("PIL._imagingcms", "littlecms"),
|
||||
"webp": ("PIL._webp", None),
|
||||
}
|
||||
|
||||
|
||||
|
@ -27,7 +27,7 @@ def check_module(feature):
|
|||
if not (feature in modules):
|
||||
raise ValueError("Unknown module %s" % feature)
|
||||
|
||||
module = modules[feature]
|
||||
module, lib = modules[feature]
|
||||
|
||||
try:
|
||||
__import__(module)
|
||||
|
@ -36,6 +36,20 @@ def check_module(feature):
|
|||
return False
|
||||
|
||||
|
||||
def version_module(feature):
|
||||
if not check_module(feature):
|
||||
return None
|
||||
|
||||
module, lib = modules[feature]
|
||||
|
||||
if lib is None:
|
||||
return None
|
||||
|
||||
attr = lib + "_version"
|
||||
|
||||
return getattr(__import__(module, fromlist=[attr]), attr)
|
||||
|
||||
|
||||
def get_supported_modules():
|
||||
"""
|
||||
:returns: A list of all supported modules.
|
||||
|
@ -43,7 +57,12 @@ def get_supported_modules():
|
|||
return [f for f in modules if check_module(f)]
|
||||
|
||||
|
||||
codecs = {"jpg": "jpeg", "jpg_2000": "jpeg2k", "zlib": "zip", "libtiff": "libtiff"}
|
||||
codecs = {
|
||||
"jpg": ("jpeg", "jpeglib"),
|
||||
"jpg_2000": ("jpeg2k", "jp2klib"),
|
||||
"zlib": ("zip", "zlib"),
|
||||
"libtiff": ("libtiff", "libtiff"),
|
||||
}
|
||||
|
||||
|
||||
def check_codec(feature):
|
||||
|
@ -57,11 +76,25 @@ def check_codec(feature):
|
|||
if feature not in codecs:
|
||||
raise ValueError("Unknown codec %s" % feature)
|
||||
|
||||
codec = codecs[feature]
|
||||
codec, lib = codecs[feature]
|
||||
|
||||
return codec + "_encoder" in dir(Image.core)
|
||||
|
||||
|
||||
def version_codec(feature):
|
||||
if not check_codec(feature):
|
||||
return None
|
||||
|
||||
codec, lib = codecs[feature]
|
||||
|
||||
version = getattr(Image.core, lib + "_version")
|
||||
|
||||
if feature == "libtiff":
|
||||
return version.split("\n")[0].split("Version ")[1]
|
||||
|
||||
return version
|
||||
|
||||
|
||||
def get_supported_codecs():
|
||||
"""
|
||||
:returns: A list of all supported codecs.
|
||||
|
@ -125,6 +158,14 @@ def check(feature):
|
|||
return False
|
||||
|
||||
|
||||
def version(feature):
|
||||
if feature in modules:
|
||||
return version_module(feature)
|
||||
if feature in codecs:
|
||||
return version_codec(feature)
|
||||
return None
|
||||
|
||||
|
||||
def get_supported():
|
||||
"""
|
||||
:returns: A list of all supported modules, features, and codecs.
|
||||
|
@ -187,7 +228,12 @@ def pilinfo(out=None, supported_formats=True):
|
|||
("xcb", "XCB (X protocol)"),
|
||||
]:
|
||||
if check(name):
|
||||
print("---", feature, "support ok", file=out)
|
||||
v = version(name)
|
||||
if v is not None:
|
||||
support = "ok (version {})".format(v)
|
||||
else:
|
||||
support = "ok"
|
||||
print("---", feature, "support", support, file=out)
|
||||
else:
|
||||
print("***", feature, "support not installed", file=out)
|
||||
print("-" * 68, file=out)
|
||||
|
|
Loading…
Reference in New Issue
Block a user