Skip to content

Commit 045c1a6

Browse files
committed
Add deprecated warning and update tests
1 parent 4b122cf commit 045c1a6

File tree

4 files changed

+70
-36
lines changed

4 files changed

+70
-36
lines changed

pystac/extensions/item_assets.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22

33
from __future__ import annotations
44

5+
import warnings
56
from typing import TYPE_CHECKING, Any, Literal
67

78
import pystac
9+
from pystac.errors import DeprecatedWarning
810
from pystac.extensions.base import ExtensionManagementMixin
911
from pystac.extensions.hooks import ExtensionHooks
1012
from pystac.item_assets import ItemAssetDefinition
@@ -30,6 +32,13 @@ class ItemAssetsExtension(ExtensionManagementMixin[pystac.Collection]):
3032
collection: pystac.Collection
3133

3234
def __init__(self, collection: pystac.Collection) -> None:
35+
warnings.warn(
36+
(
37+
"The ``item_assets`` extension is deprecated. "
38+
"``item_assets`` are now top-level collection properties."
39+
),
40+
DeprecatedWarning,
41+
)
3342
self.collection = collection
3443

3544
@property

tests/extensions/test_classification.py

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
Classification,
1919
ClassificationExtension,
2020
)
21-
from pystac.extensions.item_assets import ItemAssetsExtension
2221
from pystac.extensions.raster import RasterBand, RasterExtension
2322
from tests.utils import TestCases
2423

@@ -51,7 +50,7 @@ def plain_item() -> Item:
5150

5251

5352
@pytest.fixture
54-
def collection() -> Collection:
53+
def classification_collection() -> Collection:
5554
return Collection.from_file(CLASSIFICATION_COLLECTION_RASTER_URI)
5655

5756

@@ -108,12 +107,12 @@ def test_ext_raises_if_item_does_not_conform(plain_item: Item) -> None:
108107
ClassificationExtension.ext(plain_item)
109108

110109

111-
def test_ext_raises_on_collection(collection: pystac.Collection) -> None:
110+
def test_ext_raises_on_collection(classification_collection: Collection) -> None:
112111
with pytest.raises(
113112
pystac.errors.ExtensionTypeError,
114113
match="ClassificationExtension does not apply to type 'Collection'",
115114
) as e:
116-
ClassificationExtension.ext(collection) # type:ignore
115+
ClassificationExtension.ext(classification_collection) # type:ignore
117116
assert "Hint" in str(e.value)
118117

119118

@@ -311,24 +310,27 @@ def test_add_asset_classes(plain_item: Item) -> None:
311310
assert asset.extra_fields[CLASSES_PROP] == [{"value": 0, "name": "dummy"}]
312311

313312

314-
def test_item_asset_raster_classes(collection: Collection) -> None:
315-
item_asset = ItemAssetsExtension.ext(collection, add_if_missing=True).item_assets[
316-
"cloud-mask-raster"
317-
]
313+
def test_item_asset_raster_classes(classification_collection: Collection) -> None:
314+
assert classification_collection.item_assets
315+
item_asset = classification_collection.item_assets["cloud-mask-raster"]
318316
raster_bands = cast(list[RasterBand], RasterExtension.ext(item_asset).bands)
319317
raster_bands_ext = ClassificationExtension.ext(raster_bands[0])
320318
raster_bands_ext.__repr__()
321319
assert raster_bands_ext.classes is not None
322320

323321

324-
def test_item_assets_extension(collection: Collection) -> None:
325-
item_asset = ItemAssetsExtension.ext(collection, add_if_missing=True).item_assets[
326-
"cloud-mask-raster"
327-
]
322+
def test_item_assets_extension(classification_collection: Collection) -> None:
323+
assert classification_collection.item_assets
324+
item_asset = classification_collection.item_assets["cloud-mask-raster"]
328325
ext = ClassificationExtension.ext(item_asset)
329326
ext.__repr__()
330-
assert ClassificationExtension.get_schema_uri() in collection.stac_extensions
331-
assert collection.ext.item_assets["cloud-mask-raster"].ext.has("classification")
327+
assert (
328+
ClassificationExtension.get_schema_uri()
329+
in classification_collection.stac_extensions
330+
)
331+
assert classification_collection.item_assets["cloud-mask-raster"].ext.has(
332+
"classification"
333+
)
332334

333335

334336
def test_older_extension_version(landsat_item: Item) -> None:

tests/extensions/test_raster.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import pystac
77
from pystac import ExtensionTypeError, Item
8-
from pystac.extensions.item_assets import ItemAssetsExtension
98
from pystac.extensions.raster import (
109
DataType,
1110
Histogram,
@@ -282,11 +281,13 @@ def test_summaries_adds_uri(self) -> None:
282281
def test_collection_item_asset(self) -> None:
283282
coll = pystac.Collection.from_file(self.LANDSAT_COLLECTION_EXAMPLE_URI)
284283

285-
qa = ItemAssetsExtension.ext(coll).item_assets["qa"]
286-
ang = ItemAssetsExtension.ext(coll).item_assets["ang"]
284+
assert coll.item_assets
287285

288-
assert RasterExtension.ext(qa).bands is not None
289-
assert RasterExtension.ext(ang).bands is None
286+
qa = coll.item_assets["qa"]
287+
ang = coll.item_assets["ang"]
288+
289+
assert qa.ext.raster.bands is not None
290+
assert ang.ext.raster.bands is None
290291

291292

292293
@pytest.fixture

tests/extensions/test_item_assets.py renamed to tests/test_item_assets.py

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
import unittest
22

3+
import pytest
4+
35
from pystac import Collection
4-
from pystac.extensions.item_assets import AssetDefinition, ItemAssetsExtension
6+
from pystac.errors import DeprecatedWarning
7+
from pystac.extensions.item_assets import ItemAssetsExtension
8+
from pystac.item_assets import ItemAssetDefinition
59
from tests.utils import TestCases
610

11+
CLASSIFICATION_COLLECTION_RASTER_URI = TestCases.get_path(
12+
"data-files/classification/collection-item-assets-raster-bands.json"
13+
)
14+
715

8-
class TestItemAssetsExtension(unittest.TestCase):
16+
class TestItemAssets(unittest.TestCase):
917
def setUp(self) -> None:
1018
self.maxDiff = None
1119
self.collection = Collection.from_file(
@@ -14,13 +22,13 @@ def setUp(self) -> None:
1422

1523
def test_example(self) -> None:
1624
collection = self.collection.clone()
17-
item_ext = ItemAssetsExtension.ext(collection)
1825

19-
self.assertEqual(len(item_ext.item_assets), 13)
26+
assert collection.item_assets
27+
self.assertEqual(len(collection.item_assets), 13)
2028

2129
self.assertEqual(
22-
item_ext.item_assets["B1"],
23-
AssetDefinition(
30+
collection.item_assets["B1"],
31+
ItemAssetDefinition(
2432
{
2533
"type": "image/tiff; application=geotiff",
2634
"eo:bands": [
@@ -50,7 +58,7 @@ def test_create(self) -> None:
5058
description = "Coastal Band Top Of the Atmosphere"
5159
media_type = "image/tiff; application=geotiff"
5260
roles = ["data"]
53-
asset_defn = AssetDefinition.create(
61+
asset_defn = ItemAssetDefinition.create(
5462
title=title, description=description, media_type=media_type, roles=roles
5563
)
5664
self.assertEqual(asset_defn.title, title)
@@ -59,7 +67,7 @@ def test_create(self) -> None:
5967
self.assertEqual(asset_defn.roles, roles)
6068

6169
def test_title(self) -> None:
62-
asset_defn = AssetDefinition({})
70+
asset_defn = ItemAssetDefinition({})
6371
title = "Very Important Asset"
6472

6573
asset_defn.title = title
@@ -68,7 +76,7 @@ def test_title(self) -> None:
6876
self.assertEqual(asset_defn.to_dict()["title"], title)
6977

7078
def test_description(self) -> None:
71-
asset_defn = AssetDefinition({})
79+
asset_defn = ItemAssetDefinition({})
7280
description = "What an incredibly important asset this is!"
7381

7482
asset_defn.description = description
@@ -77,7 +85,7 @@ def test_description(self) -> None:
7785
self.assertEqual(asset_defn.to_dict()["description"], description)
7886

7987
def test_media_type(self) -> None:
80-
asset_defn = AssetDefinition({})
88+
asset_defn = ItemAssetDefinition({})
8189
media_type = "application/json"
8290

8391
asset_defn.media_type = media_type
@@ -86,7 +94,7 @@ def test_media_type(self) -> None:
8694
self.assertEqual(asset_defn.to_dict()["type"], media_type)
8795

8896
def test_roles(self) -> None:
89-
asset_defn = AssetDefinition({})
97+
asset_defn = ItemAssetDefinition({})
9098
roles = ["thumbnail"]
9199

92100
asset_defn.roles = roles
@@ -96,23 +104,37 @@ def test_roles(self) -> None:
96104

97105

98106
def test_extra_fields(collection: Collection) -> None:
99-
asset_definition = AssetDefinition.create(
107+
asset_definition = ItemAssetDefinition.create(
100108
title=None,
101109
description=None,
102110
media_type=None,
103111
roles=None,
104112
extra_fields={"raster:bands": [{"nodata": 42}]},
105113
)
106-
item_assets = ItemAssetsExtension.ext(collection, add_if_missing=True)
107-
item_assets.item_assets = {"data": asset_definition}
114+
collection.item_assets = {"data": asset_definition}
108115
collection_as_dict = collection.to_dict()
109116
assert collection_as_dict["item_assets"]["data"]["raster:bands"] == [{"nodata": 42}]
110117
asset = asset_definition.create_asset("asset.tif")
111118
assert asset.extra_fields["raster:bands"] == [{"nodata": 42}]
112119

113-
collection.ext.item_assets["data"].ext.add("raster")
114-
assert (bands := collection.ext.item_assets["data"].ext.raster.bands)
120+
collection.item_assets["data"].ext.add("raster")
121+
assert (bands := collection.item_assets["data"].ext.raster.bands)
115122
assert bands[0].nodata == 42
116123

117-
assert collection.ext.item_assets["data"].ext.has("raster")
124+
assert collection.item_assets["data"].ext.has("raster")
118125
assert collection.ext.has("raster")
126+
127+
128+
def test_item_assets_extension_is_deprecated() -> None:
129+
collection = Collection.from_file(CLASSIFICATION_COLLECTION_RASTER_URI)
130+
with pytest.warns(DeprecatedWarning, match="top-level collection properties"):
131+
item_asset = ItemAssetsExtension.ext(
132+
collection, add_if_missing=True
133+
).item_assets["cloud-mask-raster"]
134+
135+
assert item_asset.ext.has("eo")
136+
137+
with pytest.warns(DeprecatedWarning, match="top-level collection properties"):
138+
assert collection.ext.item_assets["cloud-mask-raster"].ext.has("eo")
139+
140+
assert ItemAssetsExtension.get_schema_uri() in collection.stac_extensions

0 commit comments

Comments
 (0)