Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

deprecate Fields default-includes #706

Merged
merged 1 commit into from
Jun 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
### Changed

* Added option for default route dependencies `*` can be used for `path` or `method` to match all allowed route. ([#705](https://github.com/stac-utils/stac-fastapi/pull/705))
* moved `AsyncBaseFiltersClient` and `BaseFiltersClient` classes in `stac_fastapi.extensions.core.filter.client` submodule ([#704](https://github.com/stac-utils/stac-fastapi/pull/704))
* Moved `AsyncBaseFiltersClient` and `BaseFiltersClient` classes in `stac_fastapi.extensions.core.filter.client` submodule ([#704](https://github.com/stac-utils/stac-fastapi/pull/704))
* Removed `default_includes` from `stac_fastapi.types.config.ApiSettings` ([#706](https://github.com/stac-utils/stac-fastapi/pull/706))
* Deprecated *Fields* extension `PostFieldsExtension.filter_fields` property ([#706](https://github.com/stac-utils/stac-fastapi/pull/706))

## [3.0.0a2] - 2024-05-31

Expand Down
52 changes: 52 additions & 0 deletions docs/src/tips-and-tricks.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,55 @@ For the landing page, you can set the API title, description and version using e
- `STAC FASTAPI_TITLE` (string) should be a self-explanatory title for your API.
- `STAC FASTAPI_DESCRIPTION` (string) should be a good description for your API. It can contain CommonMark.
- `STAC_FASTAPI_LANDING_ID` (string) is a unique identifier for your Landing page.


## Default `includes` in Fields extension (POST request)

The [**Fields** API extension](https://github.com/stac-api-extensions/fields) enables to filter in/out STAC Items keys (e.g `geometry`). The default behavior is to not filter out anything, but this can be overridden by providing a custom `FieldsExtensionPostRequest` class:

```python
from typing import Optional, Set

import attr
from stac_fastapi.extensions import FieldsExtension as FieldsExtensionBase
from stac_fastapi.extensions.core.fields import requests
from pydantic import BaseModel, Field


class PostFieldsExtension(requests.PostFieldsExtension):
include: Optional[Set[str]] = Field(
default_factory=lambda: {
"id",
"type",
"stac_version",
"geometry",
"bbox",
"links",
"assets",
"properties.datetime",
"collection",
}
)
exclude: Optional[Set[str]] = set()


class FieldsExtensionPostRequest(BaseModel):
"""Additional fields and schema for the POST request."""

fields: Optional[PostFieldsExtension] = Field(PostFieldsExtension())


class FieldsExtension(FieldsExtensionBase):
"""Override the POST model"""

POST = FieldsExtensionPostRequest


from stac_fastapi.api.app import StacApi

stac = StacApi(
extensions=[
FieldsExtension()
]
)
```
4 changes: 0 additions & 4 deletions stac_fastapi/api/stac_fastapi/api/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -458,10 +458,6 @@ def __attrs_post_init__(self):
self.client.title = self.title
self.client.description = self.description

fields_ext = self.get_extension(FieldsExtension)
if fields_ext:
self.settings.default_includes = fields_ext.default_includes

Settings.set(self.settings)
self.app.state.settings = self.settings

Expand Down
5 changes: 4 additions & 1 deletion stac_fastapi/api/tests/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@
from starlette.testclient import TestClient

from stac_fastapi.api.app import StacApi
from stac_fastapi.extensions.core import TokenPaginationExtension, TransactionExtension
from stac_fastapi.extensions.core import (
TokenPaginationExtension,
TransactionExtension,
)
from stac_fastapi.types import config, core


Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""Fields extension."""

from typing import List, Optional, Set
from typing import List, Optional

import attr
from fastapi import FastAPI
Expand Down Expand Up @@ -35,19 +35,6 @@ class FieldsExtension(ApiExtension):
conformance_classes: List[str] = attr.ib(
factory=lambda: ["https://api.stacspec.org/v1.0.0/item-search#fields"]
)
default_includes: Set[str] = attr.ib(
factory=lambda: {
"id",
"type",
"stac_version",
"geometry",
"bbox",
"links",
"assets",
"properties.datetime",
"collection",
}
)
schema_href: Optional[str] = attr.ib(default=None)

def register(self, app: FastAPI) -> None:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
"""Request models for the fields extension."""

import warnings
from typing import Dict, Optional, Set

import attr
from pydantic import BaseModel, Field

from stac_fastapi.types.config import Settings
from stac_fastapi.types.search import APIRequest, str2list


Expand Down Expand Up @@ -39,6 +39,7 @@ def _get_field_dict(fields: Optional[Set[str]]) -> Dict:
field_dict[parent].add(key)
else:
field_dict[field] = ... # type:ignore

return field_dict

@property
Expand All @@ -49,10 +50,17 @@ def filter_fields(self) -> Dict:
the included and excluded fields passed to the API
Ref: https://pydantic-docs.helpmanual.io/usage/exporting_models/#advanced-include-and-exclude
"""
warnings.warn(
"""The `PostFieldsExtension.filter_fields`
method is deprecated and will be removed in 3.0.""",
DeprecationWarning,
stacklevel=1,
)

# Always include default_includes, even if they
# exist in the exclude list.
include = (self.include or set()) - (self.exclude or set())
include |= Settings.get().default_includes or set()
include |= set()

return {
"include": self._get_field_dict(include),
Expand Down
6 changes: 1 addition & 5 deletions stac_fastapi/types/stac_fastapi/types/config.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""stac_fastapi.types.config module."""

from typing import Optional, Set
from typing import Optional

from pydantic_settings import BaseSettings, SettingsConfigDict

Expand All @@ -19,10 +19,6 @@ class ApiSettings(BaseSettings):
as distinct columns in the database.
"""

# TODO: Remove `default_includes` attribute so we can use
# `pydantic.BaseSettings` instead
default_includes: Optional[Set[str]] = None

stac_fastapi_title: str = "stac-fastapi"
stac_fastapi_description: str = "stac-fastapi"
stac_fastapi_version: str = "0.1"
Expand Down