diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index dda2a74..ef07a71 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,4 +19,4 @@ repos: hooks: - id: black-jupyter args: ["--skip-string-normalization"] - language_version: python3.11 + language_version: python3.12 diff --git a/.snyk b/.snyk new file mode 100644 index 0000000..09a7bb9 --- /dev/null +++ b/.snyk @@ -0,0 +1,4 @@ +# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. +version: v1.25.0 +language-settings: + python: "3.12" diff --git a/CHANGELOG.md b/CHANGELOG.md index 776f5ec..7eae6f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ +## v1.1.10 +### 2025-08-21 + +This version of HOSS updates the conda environment to support Python 3.12. This also updates the +dependent packages to their latest supportable versions and updates Harmony Service Library version. + ## v1.1.9 -### 2025-08-013 +### 2025-08-13 This version of HOSS updates fixes invalid output extents in cases where the requested bounding area (bbox, shape) extends beyond valid locations for the native diff --git a/conda_requirements.txt b/conda_requirements.txt index 1a67b24..95c3508 100644 --- a/conda_requirements.txt +++ b/conda_requirements.txt @@ -1,2 +1,2 @@ # This file should contain any requirements installed via Conda -hdf5==1.12.0 +hdf5==1.14.6 diff --git a/docker/service.Dockerfile b/docker/service.Dockerfile index b6af498..860e843 100644 --- a/docker/service.Dockerfile +++ b/docker/service.Dockerfile @@ -24,9 +24,7 @@ WORKDIR "/home" COPY ./conda_requirements.txt conda_requirements.txt # Create Conda environment -RUN conda create -y --name hoss --file conda_requirements.txt python=3.11 -q \ - --channel conda-forge \ - --override-channels +RUN conda create -y --name hoss --file conda_requirements.txt python=3.12 -q --channel conda-forge --override-channels # Copy additional Pip dependencies into the container COPY ./pip_requirements.txt pip_requirements.txt diff --git a/docker/service_version.txt b/docker/service_version.txt index 512a1fa..5ed5faa 100644 --- a/docker/service_version.txt +++ b/docker/service_version.txt @@ -1 +1 @@ -1.1.9 +1.1.10 diff --git a/hoss/__main__.py b/hoss/__main__.py index c847f68..12fb924 100644 --- a/hoss/__main__.py +++ b/hoss/__main__.py @@ -3,7 +3,7 @@ from argparse import ArgumentParser from sys import argv -from harmony import is_harmony_cli, run_cli, setup_cli +from harmony_service_lib import is_harmony_cli, run_cli, setup_cli from hoss.adapter import HossAdapter diff --git a/hoss/adapter.py b/hoss/adapter.py index 803962f..830bce3 100644 --- a/hoss/adapter.py +++ b/hoss/adapter.py @@ -28,9 +28,9 @@ import shutil from tempfile import mkdtemp -from harmony import BaseHarmonyAdapter -from harmony.message import Source -from harmony.util import HarmonyException, generate_output_filename, stage +from harmony_service_lib import BaseHarmonyAdapter +from harmony_service_lib.message import Source +from harmony_service_lib.util import HarmonyException, generate_output_filename, stage from pystac import Asset, Item from hoss.dimension_utilities import is_index_subset diff --git a/hoss/bbox_utilities.py b/hoss/bbox_utilities.py index 5857062..953dafd 100644 --- a/hoss/bbox_utilities.py +++ b/hoss/bbox_utilities.py @@ -20,8 +20,8 @@ from typing import Dict, List, Optional, Tuple, Union import numpy as np -from harmony.message import Message -from harmony.util import Config, download +from harmony_service_lib.message import Message +from harmony_service_lib.util import Config, download from hoss.exceptions import InvalidInputGeoJSON, UnsupportedShapeFileFormat diff --git a/hoss/dimension_utilities.py b/hoss/dimension_utilities.py index c667349..ac19f2b 100644 --- a/hoss/dimension_utilities.py +++ b/hoss/dimension_utilities.py @@ -15,9 +15,9 @@ from typing import Dict, Set, Tuple import numpy as np -from harmony.message import Message -from harmony.message_utility import rgetattr -from harmony.util import Config +from harmony_service_lib.message import Message +from harmony_service_lib.message_utility import rgetattr +from harmony_service_lib.util import Config from netCDF4 import Dataset from numpy.ma.core import MaskedArray from varinfo import VariableFromDmr, VarInfoFromDmr diff --git a/hoss/spatial.py b/hoss/spatial.py index c55ad76..ee56ff2 100644 --- a/hoss/spatial.py +++ b/hoss/spatial.py @@ -24,7 +24,7 @@ from typing import List, Set -from harmony.message import Message +from harmony_service_lib.message import Message from netCDF4 import Dataset from numpy.ma.core import MaskedArray from varinfo import VariableFromDmr, VarInfoFromDmr diff --git a/hoss/subset.py b/hoss/subset.py index a9e09b3..6df74e3 100644 --- a/hoss/subset.py +++ b/hoss/subset.py @@ -8,10 +8,10 @@ from logging import Logger from typing import List, Set -from harmony.message import Message, Source -from harmony.message import Variable as HarmonyVariable -from harmony.message_utility import rgetattr -from harmony.util import Config +from harmony_service_lib.message import Message, Source +from harmony_service_lib.message import Variable as HarmonyVariable +from harmony_service_lib.message_utility import rgetattr +from harmony_service_lib.util import Config from netCDF4 import Dataset from numpy.ma import masked from varinfo import VarInfoFromDmr diff --git a/hoss/temporal.py b/hoss/temporal.py index f6c8b4c..10e5f77 100644 --- a/hoss/temporal.py +++ b/hoss/temporal.py @@ -12,7 +12,7 @@ from typing import List, Set from dateutil.parser import parse as parse_datetime -from harmony.message import Message +from harmony_service_lib.message import Message from netCDF4 import Dataset from varinfo import VarInfoFromDmr diff --git a/hoss/utilities.py b/hoss/utilities.py index b6e3890..86f283b 100644 --- a/hoss/utilities.py +++ b/hoss/utilities.py @@ -13,9 +13,9 @@ from urllib.parse import quote from uuid import uuid4 -from harmony.exceptions import ForbiddenException, ServerException -from harmony.util import Config -from harmony.util import download as util_download +from harmony_service_lib.exceptions import ForbiddenException, ServerException +from harmony_service_lib.util import Config +from harmony_service_lib.util import download as util_download from hoss.exceptions import UrlAccessFailed diff --git a/pip_requirements.txt b/pip_requirements.txt index 759d08d..a226fb4 100644 --- a/pip_requirements.txt +++ b/pip_requirements.txt @@ -1,8 +1,8 @@ # This file should contain requirements to be installed via Pip. # Open source packages available from PyPI -earthdata-varinfo ~= 3.0.1 -harmony-service-lib ~= 1.0.25 -netCDF4 ~= 1.6.4 -numpy ~= 1.24.2 -pyproj ~= 3.6.1 -shapely ~= 2.0.1 +earthdata-varinfo ~= 3.1.0 +harmony-service-lib ~= 2.7.0 +netCDF4 ~= 1.7.2 +numpy ~= 2.2.6 +pyproj ~= 3.7.1 +shapely ~= 2.1.1 diff --git a/tests/pip_test_requirements.txt b/tests/pip_test_requirements.txt index 4b2bb55..d5e3c69 100644 --- a/tests/pip_test_requirements.txt +++ b/tests/pip_test_requirements.txt @@ -1,5 +1,5 @@ -coverage~=7.2.2 -pre-commit~=3.7.0 -pycodestyle~=2.10.0 -pylint~=2.17.2 +coverage~=7.9.2 +pre-commit~=4.2.0 +pycodestyle~=2.14.0 +pylint ~= 3.3.7 unittest-xml-reporting~=3.2.0 diff --git a/tests/test_adapter.py b/tests/test_adapter.py index fc35782..6cf36b7 100755 --- a/tests/test_adapter.py +++ b/tests/test_adapter.py @@ -12,8 +12,8 @@ from unittest import TestCase from unittest.mock import ANY, Mock, call, patch -from harmony.message import Message -from harmony.util import HarmonyException, config +from harmony_service_lib.message import Message +from harmony_service_lib.util import HarmonyException, config from netCDF4 import Dataset from numpy.testing import assert_array_equal from pystac import Catalog diff --git a/tests/unit/test_adapter.py b/tests/unit/test_adapter.py index 977c01d..1974476 100644 --- a/tests/unit/test_adapter.py +++ b/tests/unit/test_adapter.py @@ -3,8 +3,8 @@ from unittest import TestCase from unittest.mock import ANY, patch -from harmony.message import Message -from harmony.util import config +from harmony_service_lib.message import Message +from harmony_service_lib.util import config from hoss.adapter import HossAdapter from hoss.bbox_utilities import BBox diff --git a/tests/unit/test_bbox_utilities.py b/tests/unit/test_bbox_utilities.py index aaacada..fff6a52 100644 --- a/tests/unit/test_bbox_utilities.py +++ b/tests/unit/test_bbox_utilities.py @@ -13,8 +13,8 @@ from unittest import TestCase from unittest.mock import patch -from harmony.message import Message -from harmony.util import config +from harmony_service_lib.message import Message +from harmony_service_lib.util import config from hoss.bbox_utilities import ( BBox, diff --git a/tests/unit/test_coordinate_utilities.py b/tests/unit/test_coordinate_utilities.py index 3a5099f..f651d74 100644 --- a/tests/unit/test_coordinate_utilities.py +++ b/tests/unit/test_coordinate_utilities.py @@ -4,7 +4,7 @@ from unittest.mock import ANY, patch import numpy as np -from harmony.util import config +from harmony_service_lib.util import config from netCDF4 import Dataset from numpy.testing import assert_array_equal from pyproj import CRS diff --git a/tests/unit/test_dimension_utilities.py b/tests/unit/test_dimension_utilities.py index 962eb9b..13e71b1 100644 --- a/tests/unit/test_dimension_utilities.py +++ b/tests/unit/test_dimension_utilities.py @@ -6,8 +6,8 @@ from unittest.mock import ANY, patch import numpy as np -from harmony.message import Message -from harmony.util import config +from harmony_service_lib.message import Message +from harmony_service_lib.util import config from netCDF4 import Dataset from numpy.ma import masked_array from numpy.testing import assert_array_equal @@ -148,7 +148,7 @@ def test_get_dimension_index_range(self, mock_get_indices_from_values): get_dimension_index_range( self.ascending_dimension, requested_min_value, requested_max_value ) - mock_get_indices_from_values.called_once_with( + mock_get_indices_from_values.assert_called_once_with( self.ascending_dimension, requested_min_value, requested_max_value ) mock_get_indices_from_values.reset_mock() @@ -157,7 +157,7 @@ def test_get_dimension_index_range(self, mock_get_indices_from_values): get_dimension_index_range( self.ascending_dimension, requested_min_value, None ) - mock_get_indices_from_values.called_once_with( + mock_get_indices_from_values.assert_called_once_with( self.ascending_dimension, requested_min_value, self.ascending_dimension[:][-1], @@ -168,7 +168,7 @@ def test_get_dimension_index_range(self, mock_get_indices_from_values): get_dimension_index_range( self.ascending_dimension, None, requested_max_value ) - mock_get_indices_from_values.called_once_with( + mock_get_indices_from_values.assert_called_once_with( self.ascending_dimension, self.ascending_dimension[:][0], requested_max_value, @@ -179,7 +179,7 @@ def test_get_dimension_index_range(self, mock_get_indices_from_values): get_dimension_index_range( self.descending_dimension, requested_min_value, requested_max_value ) - mock_get_indices_from_values.called_once_with( + mock_get_indices_from_values.assert_called_once_with( self.descending_dimension, requested_max_value, requested_min_value ) mock_get_indices_from_values.reset_mock() @@ -188,7 +188,7 @@ def test_get_dimension_index_range(self, mock_get_indices_from_values): get_dimension_index_range( self.descending_dimension, requested_min_value, None ) - mock_get_indices_from_values.called_once_with( + mock_get_indices_from_values.assert_called_once_with( self.descending_dimension, self.descending_dimension[:][0], requested_min_value, @@ -199,7 +199,7 @@ def test_get_dimension_index_range(self, mock_get_indices_from_values): get_dimension_index_range( self.descending_dimension, None, requested_max_value ) - mock_get_indices_from_values.called_once_with( + mock_get_indices_from_values.assert_called_once_with( self.descending_dimension, requested_max_value, self.descending_dimension[:][-1], diff --git a/tests/unit/test_spatial.py b/tests/unit/test_spatial.py index 0199bea..80c0c44 100644 --- a/tests/unit/test_spatial.py +++ b/tests/unit/test_spatial.py @@ -4,7 +4,7 @@ from unittest.mock import ANY, call, patch import numpy as np -from harmony.message import Message +from harmony_service_lib.message import Message from netCDF4 import Dataset from numpy.testing import assert_array_equal from pyproj import CRS diff --git a/tests/unit/test_subset.py b/tests/unit/test_subset.py index 3218c3d..a1dbc9e 100644 --- a/tests/unit/test_subset.py +++ b/tests/unit/test_subset.py @@ -5,9 +5,9 @@ from unittest.mock import call, patch import numpy as np -from harmony.message import Message, Source -from harmony.message import Variable as HarmonyVariable -from harmony.util import config +from harmony_service_lib.message import Message, Source +from harmony_service_lib.message import Variable as HarmonyVariable +from harmony_service_lib.util import config from netCDF4 import Dataset from varinfo import VarInfoFromDmr diff --git a/tests/unit/test_temporal.py b/tests/unit/test_temporal.py index 627a094..def96d0 100644 --- a/tests/unit/test_temporal.py +++ b/tests/unit/test_temporal.py @@ -5,7 +5,7 @@ from unittest.mock import ANY, patch import numpy as np -from harmony.message import Message +from harmony_service_lib.message import Message from netCDF4 import Dataset from numpy.testing import assert_array_equal from varinfo import VarInfoFromDmr diff --git a/tests/unit/test_utilities.py b/tests/unit/test_utilities.py index 4e546a4..16cba13 100644 --- a/tests/unit/test_utilities.py +++ b/tests/unit/test_utilities.py @@ -2,8 +2,8 @@ from unittest import TestCase from unittest.mock import Mock, patch -from harmony.exceptions import ForbiddenException, ServerException -from harmony.util import config +from harmony_service_lib.exceptions import ForbiddenException, ServerException +from harmony_service_lib.util import config from hoss.exceptions import UrlAccessFailed from hoss.utilities import ( diff --git a/tests/utilities.py b/tests/utilities.py index 31dfd95..ffe1acc 100644 --- a/tests/utilities.py +++ b/tests/utilities.py @@ -5,7 +5,7 @@ from typing import List from unittest.mock import MagicMock -from harmony.util import bbox_to_geometry +from harmony_service_lib.util import bbox_to_geometry from pystac import Asset, Catalog, Item Granule = namedtuple('Granule', ['url', 'media_type', 'roles'])