Skip to content

Commit 2bbed37

Browse files
update to stac-fastapi 3.0.0b2 (#131)
* update to stac-fastapi 3.0.0b2 * update changelog
1 parent d7775b7 commit 2bbed37

File tree

5 files changed

+55
-10
lines changed

5 files changed

+55
-10
lines changed

CHANGES.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## [Unreleased]
44

5+
## [3.0.0a4] - 2024-07-10
6+
7+
- Update stac-fastapi libraries to `~=3.0.0b2`
8+
59
## [3.0.0a3] - 2024-07-01
610

711
- Use `quote_plus` instead of `quote` to encode database's password ([#122](https://github.com/stac-utils/stac-fastapi-pgstac/pull/122))

setup.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@
1010
"orjson",
1111
"pydantic",
1212
"stac_pydantic==3.1.*",
13-
"stac-fastapi.api~=3.0.0a4",
14-
"stac-fastapi.extensions~=3.0.0a4",
15-
"stac-fastapi.types~=3.0.0a4",
13+
"stac-fastapi.api~=3.0.0b2",
14+
"stac-fastapi.extensions~=3.0.0b2",
15+
"stac-fastapi.types~=3.0.0b2",
1616
"asyncpg",
1717
"buildpg",
1818
"brotli_asgi",

stac_fastapi/pgstac/app.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@
99

1010
from fastapi.responses import ORJSONResponse
1111
from stac_fastapi.api.app import StacApi
12-
from stac_fastapi.api.models import create_get_request_model, create_post_request_model
12+
from stac_fastapi.api.models import (
13+
ItemCollectionUri,
14+
create_get_request_model,
15+
create_post_request_model,
16+
create_request_model,
17+
)
1318
from stac_fastapi.extensions.core import (
1419
FieldsExtension,
1520
FilterExtension,
@@ -49,13 +54,25 @@
4954
else:
5055
extensions = list(extensions_map.values())
5156

57+
if any(isinstance(ext, TokenPaginationExtension) for ext in extensions):
58+
items_get_request_model = create_request_model(
59+
model_name="ItemCollectionUri",
60+
base_model=ItemCollectionUri,
61+
mixins=[TokenPaginationExtension().GET],
62+
request_type="GET",
63+
)
64+
else:
65+
items_get_request_model = ItemCollectionUri
66+
5267
post_request_model = create_post_request_model(extensions, base_model=PgstacSearch)
5368
get_request_model = create_get_request_model(extensions)
69+
5470
api = StacApi(
5571
settings=settings,
5672
extensions=extensions,
5773
client=CoreCrudClient(post_request_model=post_request_model), # type: ignore
5874
response_class=ORJSONResponse,
75+
items_get_request_model=items_get_request_model,
5976
search_get_request_model=get_request_model,
6077
search_post_request_model=post_request_model,
6178
)

stac_fastapi/pgstac/core.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from pygeofilter.backends.cql2_json import to_cql2
1414
from pygeofilter.parsers.cql2_text import parse as parse_cql2_text
1515
from pypgstac.hydration import hydrate
16+
from stac_fastapi.api.models import JSONResponse
1617
from stac_fastapi.types.core import AsyncBaseCoreClient
1718
from stac_fastapi.types.errors import InvalidQueryParameter, NotFoundError
1819
from stac_fastapi.types.requests import get_base_url
@@ -341,6 +342,14 @@ async def post_search(
341342
ItemCollection containing items which match the search criteria.
342343
"""
343344
item_collection = await self._search_base(search_request, request=request)
345+
346+
# If we have the `fields` extension enabled
347+
# we need to avoid Pydantic validation because the
348+
# Items might not be a valid STAC Item objects
349+
if fields := getattr(search_request, "fields", None):
350+
if fields.include or fields.exclude:
351+
return JSONResponse(item_collection) # type: ignore
352+
344353
return ItemCollection(**item_collection)
345354

346355
async def get_search( # noqa: C901

tests/conftest.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,12 @@
1616
from pypgstac.migrate import Migrate
1717
from pytest_postgresql.janitor import DatabaseJanitor
1818
from stac_fastapi.api.app import StacApi
19-
from stac_fastapi.api.models import create_get_request_model, create_post_request_model
19+
from stac_fastapi.api.models import (
20+
ItemCollectionUri,
21+
create_get_request_model,
22+
create_post_request_model,
23+
create_request_model,
24+
)
2025
from stac_fastapi.extensions.core import (
2126
FieldsExtension,
2227
FilterExtension,
@@ -86,7 +91,7 @@ async def pgstac(database):
8691
# Run all the tests that use the api_client in both db hydrate and api hydrate mode
8792
@pytest.fixture(
8893
params=[
89-
# hydratation, prefix
94+
# hydratation, prefix, model_validation
9095
(False, "", False),
9196
(False, "/router_prefix", False),
9297
(True, "", False),
@@ -129,13 +134,23 @@ def api_client(request, database):
129134
BulkTransactionExtension(client=BulkTransactionsClient()),
130135
]
131136

132-
post_request_model = create_post_request_model(extensions, base_model=PgstacSearch)
137+
items_get_request_model = create_request_model(
138+
model_name="ItemCollectionUri",
139+
base_model=ItemCollectionUri,
140+
mixins=[TokenPaginationExtension().GET],
141+
request_type="GET",
142+
)
143+
search_get_request_model = create_get_request_model(extensions)
144+
search_post_request_model = create_post_request_model(
145+
extensions, base_model=PgstacSearch
146+
)
133147
api = StacApi(
134148
settings=api_settings,
135149
extensions=extensions,
136-
client=CoreCrudClient(post_request_model=post_request_model),
137-
search_get_request_model=create_get_request_model(extensions),
138-
search_post_request_model=post_request_model,
150+
client=CoreCrudClient(post_request_model=search_post_request_model),
151+
items_get_request_model=items_get_request_model,
152+
search_get_request_model=search_get_request_model,
153+
search_post_request_model=search_post_request_model,
139154
response_class=ORJSONResponse,
140155
router=APIRouter(prefix=prefix),
141156
)

0 commit comments

Comments
 (0)