Skip to content

Commit 6c092d5

Browse files
authored
Merge pull request #308 from mwtoews/use-pathlike
Allow path-like objects for vector source; use Path for tests
2 parents 6a2769a + d024c53 commit 6c092d5

8 files changed

Lines changed: 111 additions & 117 deletions

File tree

pyproject.toml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ classifiers = [
3030
requires-python = ">=3.7"
3131
dependencies = [
3232
"affine",
33-
"click >7.1",
33+
"click >7.1, !=8.2.1",
3434
"cligj >=0.4",
3535
"fiona",
3636
"numpy >=1.9",
@@ -66,6 +66,14 @@ pointquery = "rasterstats.cli:pointquery"
6666
Documentation = "https://pythonhosted.org/rasterstats/"
6767
"Source Code" = "https://github.com/perrygeo/python-rasterstats"
6868

69+
[tool.pytest.ini_options]
70+
filterwarnings = [
71+
"error",
72+
"ignore::UserWarning",
73+
]
74+
testpaths = ["tests"]
75+
# addopts = "--verbose -rf --ipdb --maxfail=1"
76+
6977
[tool.setuptools.dynamic]
7078
version = {attr = "rasterstats._version.__version__"}
7179

pytest.ini

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/rasterstats/io.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import warnings
44
from collections.abc import Iterable, Mapping
55
from json import JSONDecodeError
6+
from os import PathLike
67

78
import fiona
89
import numpy as np
@@ -90,7 +91,8 @@ def parse_feature(obj):
9091

9192
def read_features(obj, layer=0):
9293
features_iter = None
93-
if isinstance(obj, str):
94+
if isinstance(obj, (str, PathLike)):
95+
obj = str(obj)
9496
try:
9597
# test it as fiona data source
9698
with fiona.open(obj, "r", layer=layer) as src:

src/rasterstats/main.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,11 @@ def gen_zonal_stats(
7575
7676
Parameters
7777
----------
78-
vectors: path to an vector source or geo-like python objects
78+
vectors : str or PathLike
79+
Path to an vector source or geo-like python objects.
7980
80-
raster: ndarray or path to a GDAL raster source
81+
raster: array_like, str or PathLike
82+
NumPy array or path to a GDAL raster source.
8183
If ndarray is passed, the ``affine`` kwarg is required.
8284
8385
layer: int or string, optional

tests/test_cli.py

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import json
2-
import os.path
32
import warnings
3+
from pathlib import Path
44

55
from click.testing import CliRunner
66

@@ -9,10 +9,11 @@
99
# Some warnings must be ignored to parse output properly
1010
# https://github.com/pallets/click/issues/371#issuecomment-223790894
1111

12+
data_dir = Path(__file__).parent / "data"
1213

1314
def test_cli_feature():
14-
raster = os.path.join(os.path.dirname(__file__), "data/slope.tif")
15-
vector = os.path.join(os.path.dirname(__file__), "data/feature.geojson")
15+
raster = str(data_dir / "slope.tif")
16+
vector = str(data_dir / "feature.geojson")
1617
runner = CliRunner()
1718
warnings.simplefilter("ignore")
1819
result = runner.invoke(
@@ -28,15 +29,15 @@ def test_cli_feature():
2829

2930

3031
def test_cli_feature_stdin():
31-
raster = os.path.join(os.path.dirname(__file__), "data/slope.tif")
32-
vector = os.path.join(os.path.dirname(__file__), "data/feature.geojson")
32+
raster = str(data_dir / "slope.tif")
33+
vector_pth = data_dir / "feature.geojson"
3334

3435
runner = CliRunner()
3536
warnings.simplefilter("ignore")
3637
result = runner.invoke(
3738
zonalstats,
3839
["--raster", raster, "--stats", "all", "--prefix", "test_"],
39-
input=open(vector).read(),
40+
input=vector_pth.read_text(),
4041
)
4142
assert result.exit_code == 0
4243
outdata = json.loads(result.output)
@@ -47,8 +48,8 @@ def test_cli_feature_stdin():
4748

4849

4950
def test_cli_features_sequence():
50-
raster = os.path.join(os.path.dirname(__file__), "data/slope.tif")
51-
vector = os.path.join(os.path.dirname(__file__), "data/featurecollection.geojson")
51+
raster = str(data_dir / "slope.tif")
52+
vector = str(data_dir / "featurecollection.geojson")
5253
runner = CliRunner()
5354
result = runner.invoke(
5455
zonalstats,
@@ -71,8 +72,8 @@ def test_cli_features_sequence():
7172

7273

7374
def test_cli_features_sequence_rs():
74-
raster = os.path.join(os.path.dirname(__file__), "data/slope.tif")
75-
vector = os.path.join(os.path.dirname(__file__), "data/featurecollection.geojson")
75+
raster = str(data_dir / "slope.tif")
76+
vector = str(data_dir / "featurecollection.geojson")
7677
runner = CliRunner()
7778
result = runner.invoke(
7879
zonalstats,
@@ -94,8 +95,8 @@ def test_cli_features_sequence_rs():
9495

9596

9697
def test_cli_featurecollection():
97-
raster = os.path.join(os.path.dirname(__file__), "data/slope.tif")
98-
vector = os.path.join(os.path.dirname(__file__), "data/featurecollection.geojson")
98+
raster = str(data_dir / "slope.tif")
99+
vector = str(data_dir / "featurecollection.geojson")
99100
runner = CliRunner()
100101
result = runner.invoke(
101102
zonalstats, [vector, "--raster", raster, "--stats", "mean", "--prefix", "test_"]
@@ -110,8 +111,8 @@ def test_cli_featurecollection():
110111

111112

112113
def test_cli_pointquery():
113-
raster = os.path.join(os.path.dirname(__file__), "data/slope.tif")
114-
vector = os.path.join(os.path.dirname(__file__), "data/featurecollection.geojson")
114+
raster = str(data_dir / "slope.tif")
115+
vector = str(data_dir / "featurecollection.geojson")
115116
runner = CliRunner()
116117
result = runner.invoke(
117118
pointquery, [vector, "--raster", raster, "--property-name", "slope"]
@@ -124,8 +125,8 @@ def test_cli_pointquery():
124125

125126

126127
def test_cli_point_sequence():
127-
raster = os.path.join(os.path.dirname(__file__), "data/slope.tif")
128-
vector = os.path.join(os.path.dirname(__file__), "data/featurecollection.geojson")
128+
raster = str(data_dir / "slope.tif")
129+
vector = str(data_dir / "featurecollection.geojson")
129130
runner = CliRunner()
130131
result = runner.invoke(
131132
pointquery,
@@ -139,8 +140,8 @@ def test_cli_point_sequence():
139140

140141

141142
def test_cli_point_sequence_rs():
142-
raster = os.path.join(os.path.dirname(__file__), "data/slope.tif")
143-
vector = os.path.join(os.path.dirname(__file__), "data/featurecollection.geojson")
143+
raster = str(data_dir / "slope.tif")
144+
vector = str(data_dir / "featurecollection.geojson")
144145
runner = CliRunner()
145146
result = runner.invoke(
146147
pointquery,

tests/test_io.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import json
2-
import os
3-
import sys
2+
from pathlib import Path
43

54
import fiona
5+
import numpy as np
66
import pytest
77
import rasterio
88
from shapely.geometry import shape
@@ -18,12 +18,9 @@
1818
window_bounds,
1919
)
2020

21-
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
22-
DATA = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data")
23-
polygons = os.path.join(DATA, "polygons.shp")
24-
raster = os.path.join(DATA, "slope.tif")
25-
26-
import numpy as np
21+
data_dir = Path(__file__).parent / "data"
22+
polygons = data_dir / "polygons.shp"
23+
raster = data_dir / "slope.tif"
2724

2825
arr = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])
2926

@@ -59,12 +56,12 @@ def test_fiona_path():
5956

6057

6158
def test_layer_index():
62-
layer = fiona.listlayers(DATA).index("polygons")
63-
assert list(read_features(DATA, layer=layer)) == target_features
59+
layer = fiona.listlayers(data_dir).index("polygons")
60+
assert list(read_features(data_dir, layer=layer)) == target_features
6461

6562

6663
def test_layer_name():
67-
assert list(read_features(DATA, layer="polygons")) == target_features
64+
assert list(read_features(data_dir, layer="polygons")) == target_features
6865

6966

7067
def test_path_unicode():

tests/test_utils.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import os
2-
import sys
1+
from pathlib import Path
32

43
import pytest
54
from shapely.geometry import LineString
@@ -13,21 +12,20 @@
1312
stats_to_csv,
1413
)
1514

16-
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
17-
DATA = os.path.join(os.path.dirname(os.path.abspath(__file__)), "data")
18-
raster = os.path.join(DATA, "slope.tif")
15+
data_dir = Path(__file__).parent / "data"
16+
raster = data_dir / "slope.tif"
1917

2018

2119
def test_csv():
22-
polygons = os.path.join(DATA, "polygons.shp")
20+
polygons = data_dir / "polygons.shp"
2321
stats = zonal_stats(polygons, raster, stats="*")
2422
csv = stats_to_csv(stats)
2523
assert csv.split()[0] == ",".join(sorted(VALID_STATS))
2624

2725

2826
def test_categorical_csv():
29-
polygons = os.path.join(DATA, "polygons.shp")
30-
categorical_raster = os.path.join(DATA, "slope_classes.tif")
27+
polygons = data_dir / "polygons.shp"
28+
categorical_raster = data_dir / "slope_classes.tif"
3129
stats = zonal_stats(polygons, categorical_raster, categorical=True)
3230
csv = stats_to_csv(stats)
3331
assert csv.split()[0] == "1.0,2.0,5.0"

0 commit comments

Comments
 (0)