Skip to content

Commit bad8970

Browse files
authored
DAS-2146 - select correct asset from stac Item (#14)
1 parent 84e154e commit bad8970

File tree

6 files changed

+124
-13
lines changed

6 files changed

+124
-13
lines changed

CHANGELOG.md

+25-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,18 @@
1-
## v1.1.0 - 2024-04-30
1+
# Changelog
2+
3+
HyBIG follows semantic versioning. All notable changes to this project will be
4+
documented in this file. The format is based on [Keep a
5+
Changelog](http://keepachangelog.com/en/1.0.0/).
6+
7+
8+
## [v1.2.0] - 2024-05-28
9+
10+
### Added
11+
Adds functionality to retrieve '`visual`' asset for multi-file
12+
granules. Harmony creates this type of asset when the UMM-G is correctly
13+
configured with a "BROWSE IMAGE SOURCE" subtype.
14+
15+
## [v1.1.0] - 2024-04-30
216

317
### Changed
418
Changes the computation for an output image's default scale extent. Previously
@@ -8,17 +22,17 @@ and uses that transformed boundry as the default region to make a scale extent f
822

923
Upgraded harmony-service-lib to v1.0.26
1024

11-
## v1.0.2 - 2024-04-05
25+
## [v1.0.2] - 2024-04-05
1226

1327
This version of HyBIG correctly handles missing/bad input data marked by _FillValue or NoData.
1428
Anytime a bad value occurs in the input raster, the output png image will set to transparent.
1529

16-
## v1.0.1 - 2024-04-05
30+
## [v1.0.1] - 2024-04-05
1731

1832
This version of HyBIG updates the repository to use `black` code formatting
1933
throughout. There should be no functional change to the service.
2034

21-
## v1.0.0 - 2024-01-22
35+
## [v1.0.0] - 2024-01-22
2236
This version of the Harmony Browse Image Generator (HyBIG) contains all
2337
functionality previously released internally to EOSDIS as
2438
sds/harmony-browse-image-generator:0.0.11.
@@ -28,3 +42,10 @@ outlined by the NASA open-source guidelines.
2842

2943
For more information on internal releases prior to NASA open-source approval,
3044
see legacy-CHANGELOG.md.
45+
46+
[unreleased]:https://github.com/nasa/harmony-browse-image-generator/compare/1.2.0..HEAD
47+
[v1.2.0]: https://github.com/nasa/harmony-browse-image-generator/compare/1.1.0..1.2.0
48+
[v1.1.0]: https://github.com/nasa/harmony-browse-image-generator/compare/1.0.2..1.1.0
49+
[v1.0.2]: https://github.com/nasa/harmony-browse-image-generator/compare/1.0.1..1.0.2
50+
[v1.0.1]: https://github.com/nasa/harmony-browse-image-generator/compare/1.0.0..1.0.1
51+
[v1.0.0]: https://github.com/nasa/harmony-browse-image-generator/compare/0.0.11-legacy..1.0.0

bin/extract-release-notes.sh

+11-2
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,20 @@
1212
###############################################################################
1313

1414
CHANGELOG_FILE="CHANGELOG.md"
15-
VERSION_PATTERN="^## v"
15+
16+
## captures versions
17+
## >## v1.0.0
18+
## >## [v1.0.0]
19+
VERSION_PATTERN="^## [\[]v"
20+
21+
## captures url links
22+
## [unreleased]:https://github.com/nasa/harmony-browse-image-generator/compare/1.2.0..HEAD
23+
## [v1.2.0]: https://github.com/nasa/harmony-browse-image-generator/compare/1.1.0..1.2.0
24+
LINK_PATTERN="^\[.*\].*\.\..*"
1625

1726
# Read the file and extract text between the first two occurrences of the
1827
# VERSION_PATTERN
1928
result=$(awk "/$VERSION_PATTERN/{c++; if(c==2) exit;} c==1" "$CHANGELOG_FILE")
2029

2130
# Print the result
22-
echo "$result" | grep -v "$VERSION_PATTERN"
31+
echo "$result" | grep -v "$VERSION_PATTERN" | grep -v "$LINK_PATTERN"

docker/service.Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ WORKDIR "/home"
1919
# Create Conda environment:
2020
COPY conda_requirements.txt conda_requirements.txt
2121
RUN conda create --yes --name hybig --file conda_requirements.txt \
22-
python=3.10 --channel conda-forge --channel defaults -q && \
22+
python=3.11 --channel conda-forge --channel defaults -q && \
2323
conda clean --all --force-pkgs-dirs --yes
2424

2525
# Install additional Pip dependencies

docker/service_version.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.1.0
1+
1.2.0

harmony_browse_image_generator/adapter.py

+26-5
Original file line numberDiff line numberDiff line change
@@ -65,18 +65,39 @@ def validate_message(self):
6565
'Harmony ScaleExtents must be in order [xmin,ymin,xmax,ymax].'
6666
)
6767

68+
def get_asset_from_item(self, item: Item) -> Asset:
69+
"""Returns the correct browse asset from a stac Item.
70+
71+
This is used to select which asset is used by HyBIG to generate
72+
the browse image following these steps:
73+
74+
1. If found, return the first asset with 'visual' in any of the item's values' roles.
75+
2. If found, return the first asset that has 'data' in its item's values' roles.
76+
3. Raise a StopIteration error.
77+
78+
"""
79+
try:
80+
return next(
81+
item_asset
82+
for item_asset in item.assets.values()
83+
if 'visual' in (item_asset.roles or [])
84+
)
85+
except StopIteration:
86+
return next(
87+
item_asset
88+
for item_asset in item.assets.values()
89+
if 'data' in (item_asset.roles or [])
90+
)
91+
6892
def process_item(self, item: Item, source: HarmonySource) -> Item:
6993
"""Processes a single input STAC item."""
94+
7095
try:
7196
working_directory = mkdtemp()
7297
results = item.clone()
7398
results.assets = {}
7499

75-
asset = next(
76-
item_asset
77-
for item_asset in item.assets.values()
78-
if 'data' in (item_asset.roles or [])
79-
)
100+
asset = self.get_asset_from_item(item)
80101

81102
color_palette = get_color_palette_from_item(item)
82103

tests/unit/test_adapter.py

+60
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
from datetime import datetime
12
from unittest import TestCase
3+
from unittest.mock import Mock
24

35
from harmony.message import Message
46
from harmony.util import config
7+
from pystac import Asset, Item
58

69
from harmony_browse_image_generator.adapter import BrowseImageGeneratorAdapter
710
from harmony_browse_image_generator.exceptions import HyBIGInvalidMessageError
@@ -152,3 +155,60 @@ def test_create_output_stac_items(self):
152155
self.assertEqual(
153156
output_stac_item.assets['auxiliary'].title, 'browse.png.aux.xml'
154157
)
158+
159+
160+
class TestAdapterAssetFromItem(TestCase):
161+
"""A class testing get_asset_from_item function."""
162+
163+
def setUp(self):
164+
self.adapter = BrowseImageGeneratorAdapter({}, {})
165+
self.visual_asset = Asset(Mock(), roles=['visual'])
166+
self.data_asset = Asset(Mock(), roles=['data'])
167+
self.none_asset = Asset(Mock(), roles=[])
168+
self.other_asset = Asset(Mock(), roles=['other'])
169+
170+
def item_fixture(self, assets: dict) -> Item:
171+
item = Item(Mock(), None, None, datetime.now(), {})
172+
item.assets = assets
173+
return item
174+
175+
def test_get_asset_from_item_with_visual_role(self):
176+
with self.subTest('data asset first'):
177+
item = self.item_fixture(
178+
{'data': self.data_asset, 'visual': self.visual_asset}
179+
)
180+
expected = self.visual_asset
181+
182+
actual = self.adapter.get_asset_from_item(item)
183+
184+
self.assertEqual(expected, actual)
185+
186+
with self.subTest('visual asset first'):
187+
item = self.item_fixture(
188+
{'visual': self.visual_asset, 'data': self.data_asset}
189+
)
190+
expected = self.visual_asset
191+
192+
actual = self.adapter.get_asset_from_item(item)
193+
194+
self.assertEqual(expected, actual)
195+
196+
def test_get_asset_from_item_with_data_role(self):
197+
item = self.item_fixture({'data': self.data_asset, 'other': self.other_asset})
198+
expected = self.data_asset
199+
200+
actual = self.adapter.get_asset_from_item(item)
201+
202+
self.assertEqual(expected, actual)
203+
204+
def test_get_asset_from_item_no_roles(self):
205+
item = self.item_fixture({'none': self.none_asset})
206+
with self.assertRaises(StopIteration):
207+
self.adapter.get_asset_from_item(item)
208+
209+
def test_get_asset_from_item_no_matching_roles(self):
210+
item = self.item_fixture(
211+
{'first': self.other_asset, 'second': self.other_asset}
212+
)
213+
with self.assertRaises(StopIteration):
214+
self.adapter.get_asset_from_item(item)

0 commit comments

Comments
 (0)