import os import pathlib import tempfile import numpy as np import pytest from skimage import io from skimage._shared.testing import assert_array_equal, fetch, assert_stacklevel from skimage._shared._dependency_checks import is_wasm from skimage.data import data_dir one_by_one_jpeg = ( b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01' b'\x00\x01\x00\x00\xff\xdb\x00C\x00\x03\x02\x02\x02\x02' b'\x02\x03\x02\x02\x02\x03\x03\x03\x03\x04\x06\x04\x04' b'\x04\x04\x04\x08\x06\x06\x05\x06\t\x08\n\n\t\x08\t\t' b'\n\x0c\x0f\x0c\n\x0b\x0e\x0b\t\t\r\x11\r\x0e\x0f\x10' b'\x10\x11\x10\n\x0c\x12\x13\x12\x10\x13\x0f\x10\x10' b'\x10\xff\xc0\x00\x0b\x08\x00\x01\x00\x01\x01\x01\x11' b'\x00\xff\xc4\x00\x14\x00\x01\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\t\xff\xc4\x00' b'\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' b'\x00\x00\x00\x00\x00\x00\xff\xda\x00\x08\x01\x01\x00' b'\x00?\x00*\x9f\xff\xd9' ) def test_stack_basic(): x = np.arange(12).reshape(3, 4) io.push(x) assert_array_equal(io.pop(), x) def test_stack_non_array(): with pytest.raises(ValueError): io.push([[1, 2, 3]]) def test_imread_file_url(): # tweak data path so that file URI works on both unix and windows. data_path = str(fetch('data/camera.png')) data_path = data_path.replace(os.path.sep, '/') image_url = f'file:///{data_path}' image = io.imread(image_url) assert image.shape == (512, 512) @pytest.mark.skipif(is_wasm, reason="no access to pytest-localserver") def test_imread_http_url(httpserver): # httpserver is a fixture provided by pytest-localserver # https://bitbucket.org/pytest-dev/pytest-localserver/ httpserver.serve_content(one_by_one_jpeg) # it will serve anything you provide to it on its url. # we add a /test.jpg so that we can identify the content # by extension image = io.imread(httpserver.url + '/test.jpg' + '?' + 's' * 266) assert image.shape == (1, 1) def test_imread_pathlib_tiff(): """Tests reading from Path object (issue gh-5545).""" # read via fetch fname = fetch('data/multipage.tif') expected = io.imread(fname) # read by passing in a pathlib.Path object path = pathlib.Path(fname) img = io.imread(path) assert img.shape == (2, 15, 10) assert_array_equal(expected, img) def _named_tempfile_func(error_class): """Create a mock function for NamedTemporaryFile that always raises. Parameters ---------- error_class : exception class The error that should be raised when asking for a NamedTemporaryFile. Returns ------- named_temp_file : callable A function that always raises the desired error. Notes ----- Although this function has general utility for raising errors, it is expected to be used to raise errors that ``tempfile.NamedTemporaryFile`` from the Python standard library could raise. As of this writing, these are ``FileNotFoundError``, ``FileExistsError``, ``PermissionError``, and ``BaseException``. See `this comment `__ for more information. """ def named_temp_file(*args, **kwargs): raise error_class() return named_temp_file @pytest.mark.parametrize( 'error_class', [FileNotFoundError, FileExistsError, PermissionError, BaseException] ) def test_failed_temporary_file(monkeypatch, error_class): fetch('data/camera.png') # tweak data path so that file URI works on both unix and windows. data_path = data_dir.lstrip(os.path.sep) data_path = data_path.replace(os.path.sep, '/') image_url = f'file:///{data_path}/camera.png' with monkeypatch.context(): monkeypatch.setattr( tempfile, 'NamedTemporaryFile', _named_tempfile_func(error_class) ) with pytest.raises(error_class): io.imread(image_url) @pytest.mark.parametrize( # Test `**plugin_args` with `mode` "kwarg", [{"plugin": None}, {"plugin": "imageio"}, {"mode": "r"}], ) def test_plugin_deprecation_on_imread(kwarg): path = fetch("data/multipage.tif") regex = ".*use `imageio` or other I/O packages directly.*" with pytest.warns(FutureWarning, match=regex) as record: io.imread(path, **kwarg) assert len(record) == 1 assert_stacklevel(record, offset=-2) @pytest.mark.parametrize( # Test `**plugin_args` with `mode` "kwarg", [{"plugin": None}, {"plugin": "imageio"}, {"append": False}], ) def test_plugin_deprecation_on_imsave(kwarg, tmp_path): path = tmp_path / "test.tif" array = np.array([0, 1], dtype=float) regex = ".*use `imageio` or other I/O packages directly.*" with pytest.warns(FutureWarning, match=regex) as record: io.imsave(path, array, **kwarg) assert len(record) == 1 assert_stacklevel(record, offset=-2) @pytest.mark.parametrize("kwarg", [{"plugin": None}, {"plugin": "imageio"}]) def test_plugin_deprecation_on_imread_collection(kwarg): pattern = data_dir + "*.png" regex = ".*use `imageio` or other I/O packages directly.*" with pytest.warns(FutureWarning, match=regex) as record: io.imread_collection(pattern, **kwarg) assert len(record) == 1 assert_stacklevel(record, offset=-2)