Skip to content

Commit d4b18a1

Browse files
committed
Add Asset.common_metadata property and fix some circular imports
1 parent f32390f commit d4b18a1

File tree

3 files changed

+56
-54
lines changed

3 files changed

+56
-54
lines changed

pystac/asset.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
from copy import copy
22
from typing import Any, Dict, List, Optional, TYPE_CHECKING, Union
33

4-
from pystac.utils import is_absolute_href, make_absolute_href
4+
from pystac import common_metadata
5+
from pystac import utils
56

67
if TYPE_CHECKING:
78
from pystac.collection import Collection as Collection_Type
@@ -94,11 +95,11 @@ def get_absolute_href(self) -> Optional[str]:
9495
str: The absolute HREF of this asset, or None if an absolute HREF could not
9596
be determined.
9697
"""
97-
if is_absolute_href(self.href):
98+
if utils.is_absolute_href(self.href):
9899
return self.href
99100
else:
100101
if self.owner is not None:
101-
return make_absolute_href(self.href, self.owner.get_self_href())
102+
return utils.make_absolute_href(self.href, self.owner.get_self_href())
102103
else:
103104
return None
104105

@@ -145,6 +146,12 @@ def clone(self) -> "Asset":
145146
extra_fields=self.extra_fields,
146147
)
147148

149+
@property
150+
def common_metadata(self) -> common_metadata.CommonMetadata:
151+
"""Access the asset's common metadata fields as a
152+
:class:`~pystac.CommonMetadata` object."""
153+
return common_metadata.CommonMetadata(self)
154+
148155
def __repr__(self) -> str:
149156
return "<Asset href={}>".format(self.href)
150157

pystac/item.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -414,11 +414,8 @@ def from_dict(
414414

415415
@property
416416
def common_metadata(self) -> pystac.CommonMetadata:
417-
"""Access the item's common metadat fields as a pystac.CommonMetadata object
418-
419-
Returns:
420-
CommonMetada: contains all common metadata fields in the items properties
421-
"""
417+
"""Access the item's common metadata fields as a
418+
:class:`~pystac.CommonMetadata` object."""
422419
return pystac.CommonMetadata(self)
423420

424421
def full_copy(

tests/test_common_metadata.py

Lines changed: 44 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from datetime import datetime
33
from typing import Any, Dict, List
44

5-
import pystac
5+
from pystac import CommonMetadata, Provider, ProviderRole, Item
66
from pystac import utils
77

88
from tests.utils import TestCases
@@ -13,12 +13,12 @@ def setUp(self) -> None:
1313
self.URI_1 = TestCases.get_path(
1414
"data-files/examples/1.0.0-beta.2/item-spec/examples/datetimerange.json"
1515
)
16-
self.ITEM_1 = pystac.Item.from_file(self.URI_1)
16+
self.ITEM_1 = Item.from_file(self.URI_1)
1717

1818
self.URI_2 = TestCases.get_path(
1919
"data-files/examples/1.0.0-beta.2/item-spec/examples/sample-full.json"
2020
)
21-
self.ITEM_2 = pystac.Item.from_file(self.URI_2)
21+
self.ITEM_2 = Item.from_file(self.URI_2)
2222

2323
self.EXAMPLE_CM_DICT: Dict[str, Any] = {
2424
"start_datetime": "2020-05-21T16:42:24.896Z",
@@ -39,11 +39,11 @@ def test_datetimes(self) -> None:
3939
start_datetime_str = self.ITEM_1.properties["start_datetime"]
4040
self.assertIsInstance(start_datetime_str, str)
4141

42-
common_metadata = self.ITEM_1.common_metadata
43-
self.assertIsInstance(common_metadata, pystac.CommonMetadata)
44-
self.assertIsInstance(common_metadata.start_datetime, datetime)
42+
cm = self.ITEM_1.common_metadata
43+
self.assertIsInstance(cm, CommonMetadata)
44+
self.assertIsInstance(cm.start_datetime, datetime)
4545
self.assertDictEqual(before, self.ITEM_1.to_dict())
46-
self.assertIsNone(common_metadata.providers)
46+
self.assertIsNone(cm.providers)
4747

4848
def test_common_metadata_start_datetime(self) -> None:
4949
x = self.ITEM_1.clone()
@@ -115,9 +115,7 @@ def test_common_metadata_providers(self) -> None:
115115
"url": "https://cool-sat.com/",
116116
}
117117
]
118-
providers_object_list = [
119-
pystac.Provider.from_dict(d) for d in providers_dict_list
120-
]
118+
providers_object_list = [Provider.from_dict(d) for d in providers_dict_list]
121119

122120
example_providers_dict_list: List[Dict[str, Any]] = [
123121
{
@@ -132,14 +130,14 @@ def test_common_metadata_providers(self) -> None:
132130
},
133131
]
134132
example_providers_object_list = [
135-
pystac.Provider.from_dict(d) for d in example_providers_dict_list
133+
Provider.from_dict(d) for d in example_providers_dict_list
136134
]
137135

138136
for i in range(len(utils.get_opt(x.common_metadata.providers))):
139137
p1 = utils.get_opt(x.common_metadata.providers)[i]
140138
p2 = providers_object_list[i]
141-
self.assertIsInstance(p1, pystac.Provider)
142-
self.assertIsInstance(p2, pystac.Provider)
139+
self.assertIsInstance(p1, Provider)
140+
self.assertIsInstance(p2, Provider)
143141
self.assertDictEqual(p1.to_dict(), p2.to_dict())
144142

145143
pd1 = x.properties["providers"][i]
@@ -153,8 +151,8 @@ def test_common_metadata_providers(self) -> None:
153151
for i in range(len(x.common_metadata.providers)):
154152
p1 = x.common_metadata.providers[i]
155153
p2 = example_providers_object_list[i]
156-
self.assertIsInstance(p1, pystac.Provider)
157-
self.assertIsInstance(p2, pystac.Provider)
154+
self.assertIsInstance(p1, Provider)
155+
self.assertIsInstance(p2, Provider)
158156
self.assertDictEqual(p1.to_dict(), p2.to_dict())
159157

160158
pd1 = x.properties["providers"][i]
@@ -231,17 +229,17 @@ def test_common_metadata_basics(self) -> None:
231229
class AssetCommonMetadataTest(unittest.TestCase):
232230
def setUp(self) -> None:
233231
self.maxDiff = None
234-
self.item = pystac.Item.from_file(
232+
self.item = Item.from_file(
235233
TestCases.get_path("data-files/item/sample-item-asset-properties.json")
236234
)
237235

238236
def test_title(self) -> None:
239237
item = self.item.clone()
240238
cm = item.common_metadata
241239
analytic = item.assets["analytic"]
242-
analytic_cm = pystac.CommonMetadata(analytic)
240+
analytic_cm = CommonMetadata(analytic)
243241
thumbnail = item.assets["thumbnail"]
244-
thumbnail_cm = pystac.CommonMetadata(thumbnail)
242+
thumbnail_cm = CommonMetadata(thumbnail)
245243

246244
item_value = cm.title
247245
a2_known_value = "Thumbnail"
@@ -261,9 +259,9 @@ def test_description(self) -> None:
261259
item = self.item.clone()
262260
cm = item.common_metadata
263261
analytic = item.assets["analytic"]
264-
analytic_cm = pystac.CommonMetadata(analytic)
262+
analytic_cm = CommonMetadata(analytic)
265263
thumbnail = item.assets["thumbnail"]
266-
thumbnail_cm = pystac.CommonMetadata(thumbnail)
264+
thumbnail_cm = CommonMetadata(thumbnail)
267265

268266
item_value = cm.description
269267
a2_known_value = "Thumbnail of the item"
@@ -283,9 +281,9 @@ def test_start_datetime(self) -> None:
283281
item = self.item.clone()
284282
item_cm = item.common_metadata
285283
analytic = item.assets["analytic"]
286-
analytic_cm = pystac.CommonMetadata(analytic)
284+
analytic_cm = CommonMetadata(analytic)
287285
thumbnail = item.assets["thumbnail"]
288-
thumbnail_cm = pystac.CommonMetadata(thumbnail)
286+
thumbnail_cm = CommonMetadata(thumbnail)
289287

290288
item_value = item_cm.start_datetime
291289
a2_known_value = utils.str_to_datetime("2017-05-01T13:22:30.040Z")
@@ -307,9 +305,9 @@ def test_end_datetime(self) -> None:
307305
item = self.item.clone()
308306
cm = item.common_metadata
309307
analytic = item.assets["analytic"]
310-
analytic_cm = pystac.CommonMetadata(analytic)
308+
analytic_cm = CommonMetadata(analytic)
311309
thumbnail = item.assets["thumbnail"]
312-
thumbnail_cm = pystac.CommonMetadata(thumbnail)
310+
thumbnail_cm = CommonMetadata(thumbnail)
313311

314312
item_value = cm.end_datetime
315313
a2_known_value = utils.str_to_datetime("2017-05-02T13:22:30.040Z")
@@ -331,9 +329,9 @@ def test_license(self) -> None:
331329
item = self.item.clone()
332330
cm = item.common_metadata
333331
analytic = item.assets["analytic"]
334-
analytic_cm = pystac.CommonMetadata(analytic)
332+
analytic_cm = CommonMetadata(analytic)
335333
thumbnail = item.assets["thumbnail"]
336-
thumbnail_cm = pystac.CommonMetadata(thumbnail)
334+
thumbnail_cm = CommonMetadata(thumbnail)
337335

338336
item_value = cm.license
339337
a2_known_value = "CC-BY-4.0"
@@ -353,16 +351,16 @@ def test_providers(self) -> None:
353351
item = self.item.clone()
354352
cm = item.common_metadata
355353
analytic = item.assets["analytic"]
356-
analytic_cm = pystac.CommonMetadata(analytic)
354+
analytic_cm = CommonMetadata(analytic)
357355
thumbnail = item.assets["thumbnail"]
358-
thumbnail_cm = pystac.CommonMetadata(thumbnail)
356+
thumbnail_cm = CommonMetadata(thumbnail)
359357

360358
item_value = cm.providers
361359
a2_known_value = [
362-
pystac.Provider(
360+
Provider(
363361
name="USGS",
364362
url="https://landsat.usgs.gov/",
365-
roles=[pystac.ProviderRole.PRODUCER, pystac.ProviderRole.LICENSOR],
363+
roles=[ProviderRole.PRODUCER, ProviderRole.LICENSOR],
366364
)
367365
]
368366

@@ -372,10 +370,10 @@ def test_providers(self) -> None:
372370

373371
# Set
374372
set_value = [
375-
pystac.Provider(
373+
Provider(
376374
name="John Snow",
377375
url="https://cholera.com/",
378-
roles=[pystac.ProviderRole.PRODUCER],
376+
roles=[ProviderRole.PRODUCER],
379377
)
380378
]
381379
analytic_cm.providers = set_value
@@ -389,9 +387,9 @@ def test_platform(self) -> None:
389387
item = self.item.clone()
390388
cm = item.common_metadata
391389
analytic = item.assets["analytic"]
392-
analytic_cm = pystac.CommonMetadata(analytic)
390+
analytic_cm = CommonMetadata(analytic)
393391
thumbnail = item.assets["thumbnail"]
394-
thumbnail_cm = pystac.CommonMetadata(thumbnail)
392+
thumbnail_cm = CommonMetadata(thumbnail)
395393

396394
item_value = cm.platform
397395
a2_known_value = "shoes"
@@ -411,9 +409,9 @@ def test_instruments(self) -> None:
411409
item = self.item.clone()
412410
cm = item.common_metadata
413411
analytic = item.assets["analytic"]
414-
analytic_cm = pystac.CommonMetadata(analytic)
412+
analytic_cm = CommonMetadata(analytic)
415413
thumbnail = item.assets["thumbnail"]
416-
thumbnail_cm = pystac.CommonMetadata(thumbnail)
414+
thumbnail_cm = CommonMetadata(thumbnail)
417415

418416
item_value = cm.instruments
419417
a2_known_value = ["caliper"]
@@ -433,9 +431,9 @@ def test_constellation(self) -> None:
433431
item = self.item.clone()
434432
cm = item.common_metadata
435433
analytic = item.assets["analytic"]
436-
analytic_cm = pystac.CommonMetadata(analytic)
434+
analytic_cm = CommonMetadata(analytic)
437435
thumbnail = item.assets["thumbnail"]
438-
thumbnail_cm = pystac.CommonMetadata(thumbnail)
436+
thumbnail_cm = CommonMetadata(thumbnail)
439437

440438
item_value = cm.constellation
441439
a2_known_value = "little dipper"
@@ -455,9 +453,9 @@ def test_mission(self) -> None:
455453
item = self.item.clone()
456454
cm = item.common_metadata
457455
analytic = item.assets["analytic"]
458-
analytic_cm = pystac.CommonMetadata(analytic)
456+
analytic_cm = CommonMetadata(analytic)
459457
thumbnail = item.assets["thumbnail"]
460-
thumbnail_cm = pystac.CommonMetadata(thumbnail)
458+
thumbnail_cm = CommonMetadata(thumbnail)
461459

462460
item_value = cm.mission
463461
a2_known_value = "possible"
@@ -477,9 +475,9 @@ def test_gsd(self) -> None:
477475
item = self.item.clone()
478476
cm = item.common_metadata
479477
analytic = item.assets["analytic"]
480-
analytic_cm = pystac.CommonMetadata(analytic)
478+
analytic_cm = CommonMetadata(analytic)
481479
thumbnail = item.assets["thumbnail"]
482-
thumbnail_cm = pystac.CommonMetadata(thumbnail)
480+
thumbnail_cm = CommonMetadata(thumbnail)
483481

484482
item_value = cm.gsd
485483
a2_known_value = 40
@@ -499,9 +497,9 @@ def test_created(self) -> None:
499497
item = self.item.clone()
500498
cm = item.common_metadata
501499
analytic = item.assets["analytic"]
502-
analytic_cm = pystac.CommonMetadata(analytic)
500+
analytic_cm = CommonMetadata(analytic)
503501
thumbnail = item.assets["thumbnail"]
504-
thumbnail_cm = pystac.CommonMetadata(thumbnail)
502+
thumbnail_cm = CommonMetadata(thumbnail)
505503

506504
item_value = cm.created
507505
a2_known_value = utils.str_to_datetime("2017-05-17T13:22:30.040Z")
@@ -523,9 +521,9 @@ def test_updated(self) -> None:
523521
item = self.item.clone()
524522
cm = item.common_metadata
525523
analytic = item.assets["analytic"]
526-
analytic_cm = pystac.CommonMetadata(analytic)
524+
analytic_cm = CommonMetadata(analytic)
527525
thumbnail = item.assets["thumbnail"]
528-
thumbnail_cm = pystac.CommonMetadata(thumbnail)
526+
thumbnail_cm = CommonMetadata(thumbnail)
529527

530528
item_value = cm.updated
531529
a2_known_value = utils.str_to_datetime("2017-05-18T13:22:30.040Z")

0 commit comments

Comments
 (0)