From 3aebcd09d97c5142e5e736111a3fb103e7776e45 Mon Sep 17 00:00:00 2001 From: Sherwin-14 Date: Sat, 12 Sep 2026 19:59:27 +0530 Subject: [PATCH 1/6] Rename CMR query objects to clarify they are queries --- earthaccess/__init__.py | 10 +++++----- earthaccess/api.py | 22 +++++++++++----------- earthaccess/results.py | 4 ++-- earthaccess/search.py | 16 ++++++++-------- earthaccess/services.py | 4 ++-- earthaccess/store.py | 4 ++-- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/earthaccess/__init__.py b/earthaccess/__init__.py index 772af5503..0227044e4 100644 --- a/earthaccess/__init__.py +++ b/earthaccess/__init__.py @@ -20,8 +20,8 @@ status, ) from .auth import Auth -from .search import DataCollection, DataCollections, DataGranule, DataGranules -from .services import DataServices +from .search import DataCollection, DataCollectionsQuery, DataGranule, DataGranulesQuery +from .services import DataServicesQuery from .store import Store from .system import PROD, UAT from .virtual import virtualize @@ -36,10 +36,10 @@ "Auth", # search.py "DataCollection", - "DataCollections", + "DataCollectionsQuery", "DataGranule", - "DataGranules", - "DataServices", + "DataGranulesQuery", + "DataServicesQuery", # store.py "Store", # api.py diff --git a/earthaccess/api.py b/earthaccess/api.py index f032c136e..72e67ac0f 100644 --- a/earthaccess/api.py +++ b/earthaccess/api.py @@ -13,11 +13,11 @@ import earthaccess from earthaccess.exceptions import LoginStrategyUnavailable, ServiceOutage -from earthaccess.services import DataServices +from earthaccess.services import DataServicesQuery from .auth import Auth from .results import DataCollection, DataGranule -from .search import CollectionQuery, DataCollections, DataGranules, GranuleQuery +from .search import CollectionQuery, DataCollectionsQuery, DataGranulesQuery, GranuleQuery from .store import Store from .system import PROD, System from .utils import _validation as validate @@ -176,9 +176,9 @@ def search_datasets(count: int = -1, **kwargs: Any) -> list[DataCollection]: ) return [] if earthaccess.__auth__.authenticated: - query = DataCollections(auth=earthaccess.__auth__).parameters(**kwargs) + query = DataCollectionsQuery(auth=earthaccess.__auth__).parameters(**kwargs) else: - query = DataCollections().parameters(**kwargs) + query = DataCollectionsQuery().parameters(**kwargs) datasets_found = query.hits() logger.info("Datasets found: %s", datasets_found) if count > 0: @@ -270,9 +270,9 @@ def search_data(count: int = -1, **kwargs: Any) -> list[DataGranule]: ``` """ if earthaccess.__auth__.authenticated: - query = DataGranules(earthaccess.__auth__).parameters(**kwargs) + query = DataGranulesQuery(earthaccess.__auth__).parameters(**kwargs) else: - query = DataGranules().parameters(**kwargs) + query = DataGranulesQuery().parameters(**kwargs) granules_found = query.hits() logger.info("Granules found: %s", granules_found) if count > 0: @@ -301,7 +301,7 @@ def search_services(count: int = -1, **kwargs: Any) -> list[Any]: services = search_services(provider="POCLOUD", keyword="COG") ``` """ - query = DataServices(auth=earthaccess.__auth__).parameters(**kwargs) + query = DataServicesQuery(auth=earthaccess.__auth__).parameters(**kwargs) hits = query.hits() logger.info("Services found: %s", hits) @@ -515,9 +515,9 @@ def collection_query() -> CollectionQuery: a query builder instance for data collections. """ if earthaccess.__auth__.authenticated: - query_builder = DataCollections(earthaccess.__auth__) + query_builder = DataCollectionsQuery(earthaccess.__auth__) else: - query_builder = DataCollections() + query_builder = DataCollectionsQuery() return query_builder @@ -528,9 +528,9 @@ def granule_query() -> GranuleQuery: a query builder instance for data granules. """ if earthaccess.__auth__.authenticated: - query_builder = DataGranules(earthaccess.__auth__) + query_builder = DataGranulesQuery(earthaccess.__auth__) else: - query_builder = DataGranules() + query_builder = DataGranulesQuery() return query_builder diff --git a/earthaccess/results.py b/earthaccess/results.py index 2f263c88d..406f980ca 100644 --- a/earthaccess/results.py +++ b/earthaccess/results.py @@ -8,7 +8,7 @@ import earthaccess from .formatters import _repr_granule_html -from .services import DataServices +from .services import DataServicesQuery @cache @@ -226,7 +226,7 @@ def services(self) -> dict[Any, list[dict[str, Any]]]: """Return list of services available for this collection.""" services = self.get("meta", {}).get("associations", {}).get("services", []) queries = ( - DataServices(auth=earthaccess.__auth__).parameters(concept_id=service) + DataServicesQuery(auth=earthaccess.__auth__).parameters(concept_id=service) for service in services ) diff --git a/earthaccess/search.py b/earthaccess/search.py index 9c65afcdd..6cafc2e20 100644 --- a/earthaccess/search.py +++ b/earthaccess/search.py @@ -24,11 +24,11 @@ type PointLike = tuple[FloatLike, FloatLike] -class DataCollections(CollectionQuery): +class DataCollectionsQuery(CollectionQuery): """Query CMR for collection metadata. ???+ Info - The DataCollection class queries against + The DataCollectionsQuery class queries against https://cmr.earthdata.nasa.gov/search/collections.umm_json, the response has to be in umm_json to use the result classes. """ @@ -37,7 +37,7 @@ class DataCollections(CollectionQuery): _format = "umm_json" def __init__(self, auth: Auth | None = None, *args: Any, **kwargs: Any) -> None: - """Builds an instance of DataCollections to query the CMR. + """Builds an instance of DataCollectionsQuery to query the CMR. Parameters: auth: An authenticated `Auth` instance. This is an optional parameter @@ -223,7 +223,7 @@ def parameters(self, **kwargs: Any) -> Self: ???+ Example ```python - query = DataCollections.parameters( + query = DataCollectionsQuery.parameters( short_name="AST_L1T", temporal=("2015-01","2015-02"), point=(42.5, -101.25) @@ -418,7 +418,7 @@ def temporal( return super().temporal(date_from, date_to, exclude_boundary) -class DataGranules(GranuleQuery): +class DataGranulesQuery(GranuleQuery): """A Granule oriented client for NASA CMR. API: https://cmr.earthdata.nasa.gov/search/site/docs/search/api.html @@ -481,7 +481,7 @@ def get(self, limit: int = 2000) -> list[DataGranule]: limit: The number of results to return. Returns: - Query results as a (possibly empty) list of `DataGranules` instances. + Query results as a (possibly empty) list of `DataGranule` instances. Raises: RuntimeError: The CMR query failed. @@ -499,7 +499,7 @@ def parameters(self, **kwargs: Any) -> Self: ???+ Example ```python - query = DataCollections.parameters( + query = DataCollectionsQuery.parameters( short_name="AST_L1T", temporal=("2015-01","2015-02"), point=(42.5, -101.25) @@ -945,7 +945,7 @@ def doi(self, doi: str) -> Self: RuntimeError: The CMR query to get the collection for the DOI fails. """ # TODO consider deferring this query until the search is executed - collection = DataCollections().doi(doi).get() + collection = DataCollectionsQuery().doi(doi).get() # TODO consider raising an exception when there are multiple collections, since # we can't know which one the user wants, and choosing one is arbitrary. diff --git a/earthaccess/services.py b/earthaccess/services.py index 1a7aa0039..95a050ede 100644 --- a/earthaccess/services.py +++ b/earthaccess/services.py @@ -8,7 +8,7 @@ from .utils import _search as search -class DataServices(ServiceQuery): +class DataServicesQuery(ServiceQuery): """A Service client for NASA CMR that returns data on collection services. API: https://cmr.earthdata.nasa.gov/search/site/docs/search/api.html#service @@ -17,7 +17,7 @@ class DataServices(ServiceQuery): _format = "umm_json" def __init__(self, auth: Auth | None = None, *args: Any, **kwargs: Any) -> None: - """Build an instance of DataService to query CMR. + """Build an instance of DataServicesQuery to query CMR. auth is an optional parameter for queries that need authentication, e.g. restricted datasets. diff --git a/earthaccess/store.py b/earthaccess/store.py index 647c046bd..03859cee9 100644 --- a/earthaccess/store.py +++ b/earthaccess/store.py @@ -32,7 +32,7 @@ from .daac import DAAC_TEST_URLS, find_provider from .exceptions import DownloadFailure, EulaNotAccepted from .results import DataGranule -from .search import DataCollections +from .search import DataCollectionsQuery logger = logging.getLogger(__name__) @@ -274,7 +274,7 @@ def _derive_daac_provider(self, daac: str) -> str | None: return find_provider(daac, True) # noqa: FBT003 def _is_cloud_collection(self, concept_id: list[str]) -> bool: - collection = DataCollections(self.auth).concept_id(concept_id).get() + collection = DataCollectionsQuery(self.auth).concept_id(concept_id).get() return len(collection) > 0 and "s3-links" in collection[0]["meta"] def _own_s3_credentials(self, links: list[dict[str, Any]]) -> str | None: From 1fa18e0b7787b24491d74f9b2df81fd8ee004734 Mon Sep 17 00:00:00 2001 From: Sherwin-14 Date: Sat, 12 Sep 2026 20:12:03 +0530 Subject: [PATCH 2/6] Update tests to reference renamed query classes --- tests/integration/test_cloud_download.py | 4 ++-- tests/integration/test_cloud_open.py | 4 ++-- tests/unit/test_collection_queries.py | 28 ++++++++++++------------ tests/unit/test_granule_queries.py | 8 +++---- tests/unit/test_results.py | 8 +++---- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/tests/integration/test_cloud_download.py b/tests/integration/test_cloud_download.py index 8365b0747..ffb0459c8 100644 --- a/tests/integration/test_cloud_download.py +++ b/tests/integration/test_cloud_download.py @@ -6,7 +6,7 @@ import earthaccess import pytest -from earthaccess import Auth, DataGranules, Store +from earthaccess import Auth, DataGranulesQuery, Store from .param import ProviderParam from .sample import get_sample_granules, top_collections_for_provider @@ -77,7 +77,7 @@ def test_earthaccess_can_download_cloud_collection_granules(tmp_path, daac): logger.info("On-premises collections for %s: %s", provider, len(top_collections)) for concept_id in top_collections: - granule_query = DataGranules().concept_id(concept_id) + granule_query = DataGranulesQuery().concept_id(concept_id) total_granules = granule_query.hits() granules = granule_query.get(granules_count) diff --git a/tests/integration/test_cloud_open.py b/tests/integration/test_cloud_open.py index 1d54332ba..73c5fb449 100644 --- a/tests/integration/test_cloud_open.py +++ b/tests/integration/test_cloud_open.py @@ -3,7 +3,7 @@ import earthaccess import magic import pytest -from earthaccess import Auth, DataGranules, Store +from earthaccess import Auth, DataGranulesQuery, Store from .param import ProviderParam from .sample import get_sample_granules, top_collections_for_provider @@ -71,7 +71,7 @@ def test_earthaccess_can_open_onprem_collection_granules(daac): logger.info("On-premises collections for %s: %s", provider, len(top_collections)) for concept_id in top_collections: - granule_query = DataGranules().concept_id(concept_id) + granule_query = DataGranulesQuery().concept_id(concept_id) total_granules = granule_query.hits() granules = granule_query.get(granules_count) assert len(granules) > 0, "Could not fetch granules" diff --git a/tests/unit/test_collection_queries.py b/tests/unit/test_collection_queries.py index 18e3cd383..47c9e1e91 100644 --- a/tests/unit/test_collection_queries.py +++ b/tests/unit/test_collection_queries.py @@ -2,7 +2,7 @@ import datetime as dt import pytest -from earthaccess.search import DataCollections +from earthaccess.search import DataCollectionsQuery valid_single_dates = [ ("2001-12-12", "2001-12-21", "2001-12-12T00:00:00Z,2001-12-21T23:59:59Z"), @@ -33,50 +33,50 @@ def test_no_default_params(): - query = DataCollections() + query = DataCollectionsQuery() assert len(query.params) == 0 def test_query_can_find_cloud_provider(): - query = DataCollections().daac("PODAAC").cloud_hosted(True) + query = DataCollectionsQuery().daac("PODAAC").cloud_hosted(True) assert query.params["provider"] == "POCLOUD" - query = DataCollections().cloud_hosted(True).daac("PODAAC") + query = DataCollectionsQuery().cloud_hosted(True).daac("PODAAC") assert query.params["provider"] == "POCLOUD" # SEDAC does not have a cloud provider, so it should default to the on prem provider - query = DataCollections().cloud_hosted(True).daac("SEDAC") + query = DataCollectionsQuery().cloud_hosted(True).daac("SEDAC") assert query.params["provider"] == "ESDIS" - query = DataCollections().daac("ASDC").cloud_hosted(True) + query = DataCollectionsQuery().daac("ASDC").cloud_hosted(True) assert query.params["provider"] == "LARC_CLOUD" - query = DataCollections().cloud_hosted(True).daac("ASDC") + query = DataCollectionsQuery().cloud_hosted(True).daac("ASDC") assert query.params["provider"] == "LARC_CLOUD" def test_querybuilder_can_handle_doi(): doi = "10.5067/AQR50-3Q7CS" - query = DataCollections().doi(doi) + query = DataCollectionsQuery().doi(doi) assert query.params["doi"] == doi - query = DataCollections().cloud_hosted(True).daac("PODAAC").doi(doi) + query = DataCollectionsQuery().cloud_hosted(True).daac("PODAAC").doi(doi) assert query.params["doi"] == doi def test_querybuilder_can_handle_has_granules(): - query = DataCollections().has_granules(False) + query = DataCollectionsQuery().has_granules(False) assert not query.params["has_granules"] - query = DataCollections().has_granules(True) + query = DataCollectionsQuery().has_granules(True) assert query.params["has_granules"] - query = DataCollections().has_granules(None) + query = DataCollectionsQuery().has_granules(None) assert "has_granules" not in query.params @pytest.mark.parametrize("start,end,expected", valid_single_dates) def test_query_can_parse_single_dates(start, end, expected): - query = DataCollections().temporal(start, end) + query = DataCollectionsQuery().temporal(start, end) assert query.params["temporal"][0] == expected @pytest.mark.parametrize("start,end,expected", invalid_single_dates) def test_query_can_handle_invalid_dates(start, end, expected): # noqa: ARG001 - query = DataCollections() + query = DataCollectionsQuery() assert "temporal" not in query.params with pytest.raises(ValueError): query.temporal(start, end) diff --git a/tests/unit/test_granule_queries.py b/tests/unit/test_granule_queries.py index 567d40bfe..a5ac7a446 100644 --- a/tests/unit/test_granule_queries.py +++ b/tests/unit/test_granule_queries.py @@ -2,7 +2,7 @@ import datetime as dt import pytest -from earthaccess.search import DataGranules +from earthaccess.search import DataGranulesQuery valid_single_dates = [ ("2001-12-12", "2001-12-21", "2001-12-12T00:00:00Z,2001-12-21T23:59:59Z"), @@ -41,13 +41,13 @@ @pytest.mark.parametrize("start,end,expected", valid_single_dates) def test_query_can_parse_single_dates(start, end, expected): - granules = DataGranules().short_name("MODIS").temporal(start, end) + granules = DataGranulesQuery().short_name("MODIS").temporal(start, end) assert granules.params["temporal"][0] == expected @pytest.mark.parametrize("start,end,expected", invalid_single_dates) def test_query_can_handle_invalid_dates(start, end, expected): # noqa: ARG001 - granules = DataGranules().short_name("MODIS") + granules = DataGranulesQuery().short_name("MODIS") assert "temporal" not in granules.params with pytest.raises(ValueError): granules.temporal(start, end) @@ -55,5 +55,5 @@ def test_query_can_handle_invalid_dates(start, end, expected): # noqa: ARG001 @pytest.mark.parametrize("bbox,expected", bbox_queries) def test_query_handles_bbox(bbox, expected): - granules = DataGranules().short_name("MODIS").bounding_box(*bbox) + granules = DataGranulesQuery().short_name("MODIS").bounding_box(*bbox) assert ("bounding_box" in granules.params) == expected diff --git a/tests/unit/test_results.py b/tests/unit/test_results.py index c866116de..cab6e1eba 100644 --- a/tests/unit/test_results.py +++ b/tests/unit/test_results.py @@ -6,7 +6,7 @@ import earthaccess import responses from earthaccess.results import DataCollection, DataGranule -from earthaccess.search import DataCollections, DataGranules +from earthaccess.search import DataCollectionsQuery, DataGranulesQuery from earthaccess.utils._search import get_results from vcr.unittest import VCRTestCase # type: ignore[import-untyped] @@ -243,7 +243,7 @@ def test_get_paginates_past_short_first_page(self): status=200, ) - query = DataGranules() + query = DataGranulesQuery() query.concept_id("C3974616058-LPCLOUD") query.temporal("2024-01-01", "2024-12-31") @@ -257,7 +257,7 @@ def test_collections_less_than_2k(self): invocations of a cmr granule search and to not fetch back more results than we ask for. """ - query = DataCollections().daac("PODAAC").cloud_hosted(True) + query = DataCollectionsQuery().daac("PODAAC").cloud_hosted(True) collections = query.get(20) # Assert that we performed a single search results query @@ -271,7 +271,7 @@ def test_collections_more_than_2k(self): invocations of a cmr granule search and to not fetch back more results than we ask for. """ - query = DataCollections() + query = DataCollectionsQuery() collections = query.get(3000) # Assert that we performed two search results queries From d14d0e05f6175a6f5b7a14872156b3c21f22d151 Mon Sep 17 00:00:00 2001 From: Sherwin-14 Date: Sat, 12 Sep 2026 20:16:42 +0530 Subject: [PATCH 3/6] Update docs for renamed query classes --- docs/api/collections/collections-query.md | 6 ++--- docs/api/collections/collections-services.md | 2 +- docs/api/granules/granules-query.md | 4 ++-- docs/user/tutorials/restricted-datasets.ipynb | 22 +++++++++---------- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/api/collections/collections-query.md b/docs/api/collections/collections-query.md index a59e6926f..8198dc850 100644 --- a/docs/api/collections/collections-query.md +++ b/docs/api/collections/collections-query.md @@ -1,8 +1,8 @@ -# Documentation for `DataCollections` +# Documentation for `DataCollectionsQuery` -### DataCollections is the class `earthaccess` uses to query CMR at the **dataset** level. +### DataCollectionsQuery is the class `earthaccess` uses to query CMR at the **dataset** level. -::: earthaccess.search.DataCollections +::: earthaccess.search.DataCollectionsQuery options: show_source: false inherited_members: true diff --git a/docs/api/collections/collections-services.md b/docs/api/collections/collections-services.md index cbb396e64..4aacd7012 100644 --- a/docs/api/collections/collections-services.md +++ b/docs/api/collections/collections-services.md @@ -1,6 +1,6 @@ # Documentation for `Collection Services` -::: earthaccess.DataServices +::: earthaccess.DataServicesQuery options: inherited_members: true show_root_heading: true diff --git a/docs/api/granules/granules-query.md b/docs/api/granules/granules-query.md index 75f1adb2e..3630da443 100644 --- a/docs/api/granules/granules-query.md +++ b/docs/api/granules/granules-query.md @@ -1,9 +1,9 @@ # Documentation for `Granules` -### DataGranules is the class `earthaccess` uses to query CMR at the **granule** level. +### DataGranulesQuery is the class `earthaccess` uses to query CMR at the **granule** level. -::: earthaccess.search.DataGranules +::: earthaccess.search.DataGranulesQuery options: inherited_members: true show_root_heading: true diff --git a/docs/user/tutorials/restricted-datasets.ipynb b/docs/user/tutorials/restricted-datasets.ipynb index 9ee1e80fa..182cbb30c 100644 --- a/docs/user/tutorials/restricted-datasets.ipynb +++ b/docs/user/tutorials/restricted-datasets.ipynb @@ -22,7 +22,7 @@ "metadata": {}, "outputs": [], "source": [ - "from earthaccess import Auth, DataCollections, DataGranules, Store\n", + "from earthaccess import Auth, DataCollectionsQuery, DataGranulesQuery, Store\n", "\n", "auth = Auth()" ] @@ -83,19 +83,19 @@ "\n", "```python\n", "# An anonymous query to CMR\n", - "Query = DataCollections().keyword('elevation')\n", + "Query = DataCollectionsQuery().keyword('elevation')\n", "# An authenticated query to CMR\n", - "Query = DataCollections(auth).keyword('elevation')\n", + "Query = DataCollectionsQuery(auth).keyword('elevation')\n", "```\n", "\n", - "and it's the same with DataGranules\n", + "and it's the same with DataGranulesQuery\n", "\n", "\n", "```python\n", "# An anonymous query to CMR\n", - "Query = DataGranules().keyword('elevation')\n", + "Query = DataGranulesQuery().keyword('elevation')\n", "# An authenticated query to CMR\n", - "Query = DataGranules(auth).keyword('elevation')\n", + "Query = DataGranulesQuery(auth).keyword('elevation')\n", "```\n", "\n", "\n", @@ -109,8 +109,8 @@ "metadata": {}, "outputs": [], "source": [ - "# The first step is to create a DataCollections query\n", - "Query = DataCollections()\n", + "# The first step is to create a DataCollectionsQuery query\n", + "Query = DataCollectionsQuery()\n", "\n", "# Use chain methods to customize our query\n", "Query.short_name(\"ATL06\").version(\"006\")\n", @@ -142,7 +142,7 @@ "metadata": {}, "outputs": [], "source": [ - "Query = DataCollections(auth)\n", + "Query = DataCollectionsQuery(auth)\n", "\n", "# Use chain methods to customize our query\n", "Query.short_name(\"ATL06\").version(\"006\")\n", @@ -166,7 +166,7 @@ "#### Interpreting the results\n", "\n", "The `hits()` method above will tell you the number of query hits, but only for publicly available data sets.\n", - "In this case because cloud hosted ICESat-2 data are not yet publicly available, CMR will return “1” hits, if you filtered DataCollections by provider = NSIDC_CPRD you'll get `0` hits. For now we need an alternative method of seeing how many cloud data sets are available at NSIDC. This is only temporary until cloud-hosted ICESat-2 become publicly available. We can create a collections object (we’re going to want one of these soon anyhow) and print the len() of the collections object to see the true number of hits. \n", + "In this case because cloud hosted ICESat-2 data are not yet publicly available, CMR will return “1” hits, if you filtered DataCollectionsQuery by provider = NSIDC_CPRD you'll get `0` hits. For now we need an alternative method of seeing how many cloud data sets are available at NSIDC. This is only temporary until cloud-hosted ICESat-2 become publicly available. We can create a collections object (we’re going to want one of these soon anyhow) and print the len() of the collections object to see the true number of hits. \n", "\n", "> **Note**: Since we cannot rely on `hits()` we need to be aware that `get()` may get us too many metadata records depending on the dataset and how broad our query is.\n" ] @@ -179,7 +179,7 @@ "outputs": [], "source": [ "Query = (\n", - " DataGranules(auth)\n", + " DataGranulesQuery(auth)\n", " .concept_id(\"C2153572614-NSIDC_CPRD\")\n", " .bounding_box(-134.7, 58.9, -133.9, 59.2)\n", " .temporal(\"2020-03-01\", \"2020-03-30\")\n", From f2c7fdc9fa38261cd4d8c3b447963d833309616c Mon Sep 17 00:00:00 2001 From: Sherwin-14 Date: Sat, 12 Sep 2026 20:22:46 +0530 Subject: [PATCH 4/6] Add changelog entry and fix import formatting --- CHANGELOG.md | 8 ++++++++ earthaccess/api.py | 7 ++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 285e09c9f..fa629922e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,14 @@ and this project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html) ## [Unreleased] +### Breaking changes + +- Renamed the query classes `DataCollections`, `DataGranules`, and + `DataServices` to `DataCollectionsQuery`, `DataGranulesQuery`, and + `DataServicesQuery`. + ([#1363](https://github.com/earthaccess-dev/earthaccess/issues/1363)) + ([@Sherwin-14](https://github.com/Sherwin-14)) + ## [v0.19.0] - 2026-09-03 ### Breaking changes diff --git a/earthaccess/api.py b/earthaccess/api.py index 72e67ac0f..2bd844683 100644 --- a/earthaccess/api.py +++ b/earthaccess/api.py @@ -17,7 +17,12 @@ from .auth import Auth from .results import DataCollection, DataGranule -from .search import CollectionQuery, DataCollectionsQuery, DataGranulesQuery, GranuleQuery +from .search import ( + CollectionQuery, + DataCollectionsQuery, + DataGranulesQuery, + GranuleQuery, +) from .store import Store from .system import PROD, System from .utils import _validation as validate From feb0c6f0ed3bd9cff585076b11bf3a2186e7c2fa Mon Sep 17 00:00:00 2001 From: Sherwin-14 Date: Thu, 17 Sep 2026 21:08:21 +0530 Subject: [PATCH 5/6] Fix README badge link and granule query page heading --- docs/api/granules/granules-query.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/granules/granules-query.md b/docs/api/granules/granules-query.md index 3630da443..bebd9b79a 100644 --- a/docs/api/granules/granules-query.md +++ b/docs/api/granules/granules-query.md @@ -1,4 +1,4 @@ -# Documentation for `Granules` +# Documentation for `DataGranulesQuery` ### DataGranulesQuery is the class `earthaccess` uses to query CMR at the **granule** level. From 6ceca5f0c655dd62fe89b690ad5230cbb2473f6f Mon Sep 17 00:00:00 2001 From: Sherwin-14 Date: Thu, 17 Sep 2026 23:00:23 +0530 Subject: [PATCH 6/6] Ignore bot-blocked links in link check --- .github/workflows/check-links.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/check-links.yml b/.github/workflows/check-links.yml index 1d75b7d80..9d2a74315 100644 --- a/.github/workflows/check-links.yml +++ b/.github/workflows/check-links.yml @@ -34,3 +34,4 @@ jobs: ^https://asdc\.larc\.nasa\.gov/project/TEMPO ^https://www\.jpl\.nasa\.gov/missions/surface-water-and-ocean-topography-swot/ ^https://wiki\.esipfed\.org/FUNding_Friday_Projects + ^https://x\.com/.*