1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
|
"""Tests of rasterio._path and alias"""
import sys
import pytest
import rasterio
from rasterio.errors import PathError
from rasterio._path import _parse_path, _vsi_path, _ParsedPath, _UnparsedPath
def test_parsed_path_name():
"""A parsed path's name property is correct"""
assert _ParsedPath('bar.tif', 'foo.zip', 'zip').name == 'zip://foo.zip!bar.tif'
def test_parsed_path_name_no_archive():
"""A parsed path's name property is correct"""
assert _ParsedPath('bar.tif', None, 'file').name == 'file://bar.tif'
def test_parsed_path_name_no_scheme():
"""A parsed path's name property is correct"""
assert _ParsedPath('bar.tif', None, None).name == 'bar.tif'
def test_unparsed_path_name():
"""An unparsed path's name property is correct"""
assert _UnparsedPath('/vsifoo/bar/tif').name == '/vsifoo/bar/tif'
@pytest.mark.parametrize('scheme', ['s3', 'ftp', 'http', 'https', 'zip+s3'])
def test_parsed_path_remote(scheme):
"""A parsed path is remote"""
assert _ParsedPath('example.com/foo.tif', None, scheme).is_remote
@pytest.mark.parametrize("uri", ["/test.tif", "file:///test.tif"])
def test_parsed_path_not_remote(uri):
"""Check for paths that are not remote"""
assert not _ParsedPath.from_uri(uri).is_remote
@pytest.mark.parametrize('scheme', [None, '', 'zip', 'tar', 'file', 'zip+file'])
def test_parsed_path_file_local(scheme):
"""A parsed path is remote"""
assert _ParsedPath('foo.tif', None, scheme).is_local
@pytest.mark.parametrize(
"uri", ["s3://bucket/test.tif", "https://example.com/test.tif"]
)
def test_parsed_path_not_local(uri):
"""Check for paths that are not local"""
assert not _ParsedPath.from_uri(uri).is_local
def test_parse_path_zip():
"""Correctly parse zip scheme URL"""
parsed = _parse_path('zip://tests/data/files.zip!foo.tif')
assert parsed.path == 'foo.tif'
assert parsed.archive == 'tests/data/files.zip'
assert parsed.scheme == 'zip'
def test_parse_path_zip_and_file():
"""Correctly parse zip+file scheme URL"""
parsed = _parse_path('zip+file://tests/data/files.zip!foo.tif')
assert parsed.path == 'foo.tif'
assert parsed.archive == 'tests/data/files.zip'
assert parsed.scheme == 'zip+file'
def test_parse_path_file_scheme():
"""Correctly parse file:// URL"""
parsed = _parse_path('file://foo.tif')
assert parsed.path == 'foo.tif'
assert parsed.archive is None
assert parsed.scheme == 'file'
def test_parse_path_file():
"""Correctly parse an ordinary filesystem path"""
parsed = _parse_path('/foo.tif')
assert parsed.path == '/foo.tif'
def test_parse_gdal_vsi():
"""GDAL dataset identifiers fall through properly"""
assert _parse_path('/vsifoo/bar').path == '/vsifoo/bar'
def test_parse_gdal():
"""GDAL dataset identifiers fall through properly"""
assert _parse_path('GDAL:filepath:varname').path == 'GDAL:filepath:varname'
def test_parse_http_query_slashes():
"""Make sure password unmodified GH2602"""
parsed = _parse_path('https://foo.tif?bar=a//b')
assert parsed.path == 'foo.tif?bar=a//b'
assert parsed.archive is None
assert parsed.scheme == 'https'
def test_parse_http_password():
"""Make sure password unmodified GH2776"""
url = "https://xxx:yyy!@actinia.mundialis.de/api/v3/resources/demouser/resource_id-1e904ec8-ad55-4eda-8f0d-440eb61d891a/baum.tif"
parsed = _parse_path(url)
assert parsed.path == "xxx:yyy!@actinia.mundialis.de/api/v3/resources/demouser/resource_id-1e904ec8-ad55-4eda-8f0d-440eb61d891a/baum.tif"
assert parsed.archive is None
assert parsed.scheme == 'https'
@pytest.mark.skipif(sys.platform == 'win32', reason="Checking behavior on posix, not win32")
def test_parse_windows_path(monkeypatch):
"""Return Windows paths unparsed"""
monkeypatch.setattr(sys, 'platform', 'win32')
assert _parse_path(r'C:\\foo.tif').path == r'C:\\foo.tif'
def test_vsi_path_scheme():
"""Correctly make a vsi path"""
assert _vsi_path(_ParsedPath('/foo.tif', 'tests/data/files.zip', 'zip')) == '/vsizip/tests/data/files.zip/foo.tif'
def test_path_as_vsi_scheme():
"""Correctly make a vsi path"""
assert _ParsedPath('/foo.tif', 'tests/data/files.zip', 'zip').as_vsi() == '/vsizip/tests/data/files.zip/foo.tif'
def test_vsi_path_file():
"""Correctly make and ordinary file path from a file path"""
assert _vsi_path(_ParsedPath('foo.tif', None, 'file')) == 'foo.tif'
def test_vsi_path_curl():
"""Correctly make and ordinary file path from a https path"""
assert _vsi_path(_ParsedPath('example.com/foo.tif', None, 'https')) == '/vsicurl/https://example.com/foo.tif'
def test_vsi_path_unparsed():
"""Correctly make GDAL filename from unparsed path"""
assert _vsi_path(_UnparsedPath("foo")) == "foo"
def test_path_as_vsi_unparsed():
"""Correctly make GDAL filename from unparsed path"""
assert _UnparsedPath("foo").as_vsi() == "foo"
def test_vsi_path_error():
"""Raise ValuError if argument is not a path"""
with pytest.raises(ValueError):
_vsi_path("foo")
def test_read_vfs_zip():
with rasterio.open(
'zip://tests/data/files.zip!/RGB.byte.tif') as src:
assert src.name == 'zip://tests/data/files.zip!/RGB.byte.tif'
assert src.count == 3
def test_read_vfs_file():
with rasterio.open(
'file://tests/data/RGB.byte.tif') as src:
assert src.name == 'file://tests/data/RGB.byte.tif'
assert src.count == 3
def test_read_vfs_zip_cmp_array():
with rasterio.open(
'zip://tests/data/files.zip!/RGB.byte.tif') as src:
zip_arr = src.read()
with rasterio.open(
'file://tests/data/RGB.byte.tif') as src:
file_arr = src.read()
assert zip_arr.dumps() == file_arr.dumps()
def test_read_vfs_none():
with rasterio.open(
'tests/data/RGB.byte.tif') as src:
assert src.name == 'tests/data/RGB.byte.tif'
assert src.count == 3
def test_parse_path_accept_get_params():
# See https://github.com/rasterio/rasterio/issues/1121
parsed = _parse_path('http://example.com/index?a=1')
assert isinstance(parsed, _ParsedPath)
assert parsed.path == 'example.com/index?a=1'
assert parsed.archive is None
assert parsed.scheme == 'http'
def test_vsi_path_zip():
"""A zip:// URLs vsi path is correct (see #1377)"""
url = 'zip:///path/to/zip/some.zip!path/to/file.txt'
assert _vsi_path(_parse_path(url)) == '/vsizip//path/to/zip/some.zip/path/to/file.txt'
def test_vsi_path_zip_plus_https():
"""A zip+https:// URLs vsi path is correct (see #1151)"""
url = 'zip+https://example.com/foo.zip!bar.tif'
assert _vsi_path(_parse_path(url)) == '/vsizip/vsicurl/https://example.com/foo.zip/bar.tif'
@pytest.mark.parametrize("path", ["DRIVER:/vsifoo/bar:var", "SENTINEL2_L1C:S2A_OPER_MTD_SAFL1C_PDMC_20150818T101440_R022_V20150813T102406_20150813T102406.xml:10m:EPSG_32632"])
def test_driver_prefixed_path(path):
parsed = _parse_path(path)
assert isinstance(parsed, _UnparsedPath)
@pytest.mark.parametrize("path", [0, -1.0, object()])
def test_path_error(path):
with pytest.raises(PathError):
_parse_path(path)
def test_parse_path():
pathlib = pytest.importorskip("pathlib")
assert isinstance(_parse_path(pathlib.Path("/foo/bar.tif")), _ParsedPath)
def test_parse_path_win():
pathlib = pytest.importorskip("pathlib")
assert isinstance(_parse_path(pathlib.PureWindowsPath(r"C:\foo\bar.tif")), _ParsedPath)
def test_parse_gdal_vsi_alias():
"""Check that the alias function works"""
assert _parse_path('/vsifoo/bar').path == '/vsifoo/bar'
def test_parse_zip_windows(monkeypatch):
"""Parse a zip+ Windows path."""
monkeypatch.setattr(sys, "platform", "win32")
path = _parse_path("zip://D:\\a\\Fiona\\Fiona\\tests\\data\\coutwildrnp.zip!coutwildrnp.shp")
vsi_path = _vsi_path(path)
assert vsi_path.startswith("/vsizip/D")
assert vsi_path.endswith("coutwildrnp.zip/coutwildrnp.shp")
def test_parse_zip_windows(monkeypatch):
"""Parse a tar+ Windows path."""
monkeypatch.setattr(sys, "platform", "win32")
path = _parse_path("tar://D:\\a\\Fiona\\Fiona\\tests\\data\\coutwildrnp.tar!testing/coutwildrnp.shp")
vsi_path = _vsi_path(path)
assert vsi_path.startswith("/vsitar/D")
assert vsi_path.endswith("coutwildrnp.tar/testing/coutwildrnp.shp")
|