From 3a4b13e686c9b73a8b75eec5ee8b8c791b337388 Mon Sep 17 00:00:00 2001 From: Stijn Caerts Date: Tue, 3 Oct 2023 13:52:39 +0200 Subject: [PATCH 1/3] update stac-fastapi to v2.4.8 --- stac_fastapi/elasticsearch/setup.py | 8 ++--- .../stac_fastapi/elasticsearch/app.py | 35 ++----------------- .../stac_fastapi/elasticsearch/core.py | 5 +++ .../elasticsearch/tests/api/test_api.py | 4 ++- stac_fastapi/elasticsearch/tests/conftest.py | 14 ++++---- 5 files changed, 20 insertions(+), 46 deletions(-) diff --git a/stac_fastapi/elasticsearch/setup.py b/stac_fastapi/elasticsearch/setup.py index 7b0edddb..1a7fc7cf 100644 --- a/stac_fastapi/elasticsearch/setup.py +++ b/stac_fastapi/elasticsearch/setup.py @@ -8,11 +8,11 @@ install_requires = [ "fastapi", "attrs", - "pydantic[dotenv]", + "pydantic[dotenv]<2", "stac_pydantic==2.0.*", - "stac-fastapi.types==2.4.3", - "stac-fastapi.api==2.4.3", - "stac-fastapi.extensions==2.4.3", + "stac-fastapi.types==2.4.8", + "stac-fastapi.api==2.4.8", + "stac-fastapi.extensions==2.4.8", "elasticsearch[async]==7.17.9", "elasticsearch-dsl==7.4.1", "pystac[validation]", diff --git a/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py b/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py index 84eece90..96d07314 100644 --- a/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py +++ b/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py @@ -29,48 +29,17 @@ session = Session.create_from_settings(settings) -@attr.s -class FixedSortExtension(SortExtension): - """SortExtension class fixed with correct paths, removing extra forward-slash.""" - - conformance_classes: List[str] = attr.ib( - factory=lambda: ["https://api.stacspec.org/v1.0.0-beta.4/item-search#sort"] - ) - - @attr.s class FixedFilterExtension(FilterExtension): - """FilterExtension class fixed with correct paths, removing extra forward-slash.""" - - conformance_classes: List[str] = attr.ib( - default=[ - "https://api.stacspec.org/v1.0.0-rc.1/item-search#filter", - "http://www.opengis.net/spec/ogcapi-features-3/1.0/conf/filter", - "http://www.opengis.net/spec/ogcapi-features-3/1.0/conf/features-filter", - "http://www.opengis.net/spec/cql2/1.0/conf/cql2-text", - "http://www.opengis.net/spec/cql2/1.0/conf/cql2-json", - "http://www.opengis.net/spec/cql2/1.0/conf/basic-cql2", - "http://www.opengis.net/spec/cql2/1.0/conf/basic-spatial-operators", - ] - ) client = attr.ib(factory=EsAsyncBaseFiltersClient) -@attr.s -class FixedQueryExtension(QueryExtension): - """Fixed Query Extension string.""" - - conformance_classes: List[str] = attr.ib( - factory=lambda: ["https://api.stacspec.org/v1.0.0-beta.4/item-search#query"] - ) - - extensions = [ TransactionExtension(client=TransactionsClient(session=session), settings=settings), BulkTransactionExtension(client=BulkTransactionsClient(session=session)), FieldsExtension(), - FixedQueryExtension(), - FixedSortExtension(), + QueryExtension(), + SortExtension(), TokenPaginationExtension(), ContextExtension(), FixedFilterExtension(), diff --git a/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/core.py b/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/core.py index e2af91a6..776ac746 100644 --- a/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/core.py +++ b/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/core.py @@ -286,6 +286,7 @@ async def get_search( token: Optional[str] = None, fields: Optional[List[str]] = None, sortby: Optional[str] = None, + intersects: Optional[str] = None, # filter: Optional[str] = None, # todo: requires fastapi > 2.3 unreleased # filter_lang: Optional[str] = None, # todo: requires fastapi > 2.3 unreleased **kwargs, @@ -302,6 +303,7 @@ async def get_search( token (Optional[str]): Access token to use when searching the catalog. fields (Optional[List[str]]): Fields to include or exclude from the results. sortby (Optional[str]): Sorting options for the results. + intersects (Optional[str]): GeoJSON geometry to search in. kwargs: Additional parameters to be passed to the API. Returns: @@ -322,6 +324,9 @@ async def get_search( if datetime: base_args["datetime"] = datetime + if intersects: + base_args["intersects"] = intersects + if sortby: # https://github.com/radiantearth/stac-spec/tree/master/api-spec/extensions/sort#http-get-or-post-form sort_param = [] diff --git a/stac_fastapi/elasticsearch/tests/api/test_api.py b/stac_fastapi/elasticsearch/tests/api/test_api.py index 7dbf3996..042d9de4 100644 --- a/stac_fastapi/elasticsearch/tests/api/test_api.py +++ b/stac_fastapi/elasticsearch/tests/api/test_api.py @@ -187,7 +187,9 @@ async def test_app_query_extension_limit_lt0(app_client): async def test_app_query_extension_limit_gt10000(app_client): - assert (await app_client.post("/search", json={"limit": 10001})).status_code == 400 + resp = await app_client.post("/search", json={"limit": 10001}) + assert resp.status_code == 200 + assert resp.json()['context']['limit'] == 10000 async def test_app_query_extension_limit_10000(app_client): diff --git a/stac_fastapi/elasticsearch/tests/conftest.py b/stac_fastapi/elasticsearch/tests/conftest.py index b755425c..0a24b1f8 100644 --- a/stac_fastapi/elasticsearch/tests/conftest.py +++ b/stac_fastapi/elasticsearch/tests/conftest.py @@ -10,11 +10,6 @@ from stac_fastapi.api.app import StacApi from stac_fastapi.api.models import create_get_request_model, create_post_request_model -from stac_fastapi.elasticsearch.app import ( - FixedFilterExtension, - FixedQueryExtension, - FixedSortExtension, -) from stac_fastapi.elasticsearch.config import AsyncElasticsearchSettings from stac_fastapi.elasticsearch.core import ( BulkTransactionsClient, @@ -22,9 +17,12 @@ TransactionsClient, ) from stac_fastapi.elasticsearch.database_logic import create_collection_index +from stac_fastapi.elasticsearch.extensions import QueryExtension from stac_fastapi.extensions.core import ( # FieldsExtension, ContextExtension, FieldsExtension, + FilterExtension, + SortExtension, TokenPaginationExtension, TransactionExtension, ) @@ -160,11 +158,11 @@ async def app(): client=TransactionsClient(session=None), settings=settings ), ContextExtension(), - FixedSortExtension(), + SortExtension(), FieldsExtension(), - FixedQueryExtension(), + QueryExtension(), TokenPaginationExtension(), - FixedFilterExtension(), + FilterExtension(), ] post_request_model = create_post_request_model(extensions) From 3117b8b339d074660b922c44eaf2c96a8ea068e6 Mon Sep 17 00:00:00 2001 From: Stijn Caerts Date: Tue, 3 Oct 2023 13:56:25 +0200 Subject: [PATCH 2/3] fix pre-commit checks --- stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py | 4 ++-- stac_fastapi/elasticsearch/tests/api/test_api.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py b/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py index 96d07314..4c59729d 100644 --- a/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py +++ b/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py @@ -1,6 +1,4 @@ """FastAPI application.""" -from typing import List - import attr from stac_fastapi.api.app import StacApi @@ -31,6 +29,8 @@ @attr.s class FixedFilterExtension(FilterExtension): + """FilterExtension class implementation with EsAsyncBaseFiltersClient.""" + client = attr.ib(factory=EsAsyncBaseFiltersClient) diff --git a/stac_fastapi/elasticsearch/tests/api/test_api.py b/stac_fastapi/elasticsearch/tests/api/test_api.py index 042d9de4..c8edca78 100644 --- a/stac_fastapi/elasticsearch/tests/api/test_api.py +++ b/stac_fastapi/elasticsearch/tests/api/test_api.py @@ -189,7 +189,7 @@ async def test_app_query_extension_limit_lt0(app_client): async def test_app_query_extension_limit_gt10000(app_client): resp = await app_client.post("/search", json={"limit": 10001}) assert resp.status_code == 200 - assert resp.json()['context']['limit'] == 10000 + assert resp.json()["context"]["limit"] == 10000 async def test_app_query_extension_limit_10000(app_client): From 6e2fc2d8a1de92c286faaaf904a67288f28e4e00 Mon Sep 17 00:00:00 2001 From: Stijn Caerts Date: Tue, 3 Oct 2023 15:22:00 +0200 Subject: [PATCH 3/3] pass client to filter extension object instead of creating custom class --- .../elasticsearch/stac_fastapi/elasticsearch/app.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py b/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py index 4c59729d..e3c4bc64 100644 --- a/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py +++ b/stac_fastapi/elasticsearch/stac_fastapi/elasticsearch/app.py @@ -1,6 +1,4 @@ """FastAPI application.""" -import attr - from stac_fastapi.api.app import StacApi from stac_fastapi.api.models import create_get_request_model, create_post_request_model from stac_fastapi.elasticsearch.config import ElasticsearchSettings @@ -26,14 +24,6 @@ settings = ElasticsearchSettings() session = Session.create_from_settings(settings) - -@attr.s -class FixedFilterExtension(FilterExtension): - """FilterExtension class implementation with EsAsyncBaseFiltersClient.""" - - client = attr.ib(factory=EsAsyncBaseFiltersClient) - - extensions = [ TransactionExtension(client=TransactionsClient(session=session), settings=settings), BulkTransactionExtension(client=BulkTransactionsClient(session=session)), @@ -42,7 +32,7 @@ class FixedFilterExtension(FilterExtension): SortExtension(), TokenPaginationExtension(), ContextExtension(), - FixedFilterExtension(), + FilterExtension(client=EsAsyncBaseFiltersClient()), ] post_request_model = create_post_request_model(extensions)