Skip to content

Commit ac096f2

Browse files
authored
report pair-search conformance classes (#8)
* report pair-search conformance classes
1 parent 1471961 commit ac096f2

File tree

4 files changed

+82
-0
lines changed

4 files changed

+82
-0
lines changed

src/stac_fastapi_pgstac_pair_search/client.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from stac_pydantic.item import Item
2020

2121
from stac_fastapi_pgstac_pair_search.models import PairSearchRequest, PairSearchLinks
22+
from stac_fastapi_pgstac_pair_search.extensions.pair_search import PairSearchExtension
2223

2324

2425
logger = logging.getLogger(__name__)
@@ -217,6 +218,8 @@ def render_sql(pair_search_request: PairSearchRequest) -> Tuple[str, List[Any]]:
217218

218219

219220
def register_pair_search(api: StacApi):
221+
"""Shoehorn pair-search on an instantiated StacApi."""
222+
220223
# initialize the client
221224
pair_search_client = PairSearchClient(
222225
stac_version=api.stac_version,
@@ -226,6 +229,12 @@ def register_pair_search(api: StacApi):
226229
extensions=api.extensions,
227230
)
228231

232+
# this is required to add conformance classes:
233+
pair_search_extension = PairSearchExtension()
234+
api.extensions.append(pair_search_extension)
235+
api.client.extensions.append(pair_search_extension)
236+
237+
# add api routes:
229238
# POST /pair-search
230239
api.app.add_api_route(
231240
name="Pair Search",

src/stac_fastapi_pgstac_pair_search/extensions/__init__.py

Whitespace-only changes.
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import attr
2+
from enum import Enum
3+
from typing import List, Optional
4+
5+
from fastapi import FastAPI
6+
from stac_fastapi.types.extension import ApiExtension
7+
8+
from stac_fastapi_pgstac_pair_search.models import PairSearchRequest
9+
10+
11+
class PairSearchConformanceClasses(str, Enum):
12+
"""Conformance classes for the Pair-Search extension."""
13+
14+
SearchCore = "https://foo.bar/v0.0.1/pair-search"
15+
Query = "https://foo.bar/v0.0.1/pair-search#query"
16+
CQL2NumberDifference = "https://foo.bar/ext/cq12/1.0/conf/n_diff"
17+
CQL2TimeDifference = "https://foo.bar/ext/cq12/1.0/conf/t_diff"
18+
CQL2TimeStart = "https://foo.bar/ext/cq12/1.0/conf/t_start"
19+
CQL2TimeEnd = "https://foo.bar/ext/cq12/1.0/conf/t_end"
20+
CQL2RelativeGeometryOverlap = "https://foo.bar/ext/cq12/1.0/conf/s_raoverlap"
21+
22+
23+
@attr.s
24+
class PairSearchExtension(ApiExtension):
25+
"""Query Extension.
26+
27+
The Query extension adds an additional `query` parameter to `/search` requests which
28+
allows the caller to perform queries against item metadata (ex. find all images with
29+
cloud cover less than 15%).
30+
https://github.com/stac-api-extensions/query
31+
"""
32+
33+
GET = PairSearchRequest
34+
POST = PairSearchRequest
35+
36+
conformance_classes: List[str] = attr.ib(
37+
factory=lambda: PairSearchConformanceClasses
38+
)
39+
schema_href: Optional[str] = attr.ib(default=None)
40+
41+
def register(self, app: FastAPI) -> None:
42+
"""Register the extension with a FastAPI application.
43+
44+
Args:
45+
app: target FastAPI application.
46+
47+
Returns:
48+
None
49+
"""
50+
pass

tests/test_app.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,29 @@ def test_app(client):
99
assert response.json()
1010

1111

12+
@pytest.mark.parametrize(
13+
"class_name",
14+
[
15+
"pair-search",
16+
"n_diff",
17+
"t_diff",
18+
"t_start",
19+
"t_end",
20+
"s_raoverlap",
21+
],
22+
)
23+
def test_conformance(client, class_name):
24+
response = client.get("/conformance")
25+
assert response.status_code == 200
26+
assert response.json()
27+
28+
for conformance_class_uri in response.json()["conformsTo"]:
29+
if class_name in conformance_class_uri:
30+
break
31+
else:
32+
raise ValueError(f"{class_name} not found")
33+
34+
1235
def test_search(client):
1336
response = client.get("/search")
1437
assert response.status_code == 200

0 commit comments

Comments
 (0)