Skip to content
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
10 changes: 5 additions & 5 deletions stapi-fastapi/src/stapi_fastapi/backends/product_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@
- Returning returns.result.Failure[Exception] will result in a 500.

Note:
Backends must validate search constraints and return
returns.result.Failure[stapi_fastapi.exceptions.ConstraintsException] if not valid.
Backends must validate search queryables and return
returns.result.Failure[stapi_fastapi.exceptions.QueryablesException] if not valid.
"""

SearchOpportunitiesAsync = Callable[
Expand All @@ -63,8 +63,8 @@
- Should return returns.result.Success[OpportunitySearchRecord]
- Returning returns.result.Failure[Exception] will result in a 500.

Backends must validate search constraints and return
returns.result.Failure[stapi_fastapi.exceptions.ConstraintsException] if not valid.
Backends must validate search queryables and return
returns.result.Failure[stapi_fastapi.exceptions.QueryablesException] if not valid.
"""

GetOpportunityCollection = Callable[
Expand Down Expand Up @@ -105,5 +105,5 @@

Note:
Backends must validate order payload and return
returns.result.Failure[stapi_fastapi.exceptions.ConstraintsException] if not valid.
returns.result.Failure[stapi_fastapi.exceptions.QueryablesException] if not valid.
"""
2 changes: 1 addition & 1 deletion stapi-fastapi/src/stapi_fastapi/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class StapiException(HTTPException):
pass


class ConstraintsException(StapiException):
class QueryablesException(StapiException):
def __init__(self, detail: Any) -> None:
super().__init__(status.HTTP_422_UNPROCESSABLE_ENTITY, detail)

Expand Down
12 changes: 6 additions & 6 deletions stapi-fastapi/src/stapi_fastapi/models/product.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

from typing import TYPE_CHECKING, Any

from stapi_pydantic import Constraints, OpportunityProperties, OrderParameters
from stapi_pydantic import OpportunityProperties, OrderParameters, Queryables
from stapi_pydantic import Product as BaseProduct

if TYPE_CHECKING:
Expand All @@ -21,7 +21,7 @@ class Product(BaseProduct):
_get_opportunity_collection: GetOpportunityCollection | None

# we don't want to include these in the model fields
_constraints: type[Constraints]
_queryables: type[Queryables]
_opportunity_properties: type[OpportunityProperties]
_order_parameters: type[OrderParameters]

Expand All @@ -32,7 +32,7 @@ def __init__(
search_opportunities: SearchOpportunities | None = None,
search_opportunities_async: SearchOpportunitiesAsync | None = None,
get_opportunity_collection: GetOpportunityCollection | None = None,
constraints: type[Constraints],
queryables: type[Queryables],
opportunity_properties: type[OpportunityProperties],
order_parameters: type[OrderParameters],
**kwargs: Any,
Expand All @@ -49,7 +49,7 @@ def __init__(
self._search_opportunities = search_opportunities
self._search_opportunities_async = search_opportunities_async
self._get_opportunity_collection = get_opportunity_collection
self._constraints = constraints
self._queryables = queryables
self._opportunity_properties = opportunity_properties
self._order_parameters = order_parameters

Expand Down Expand Up @@ -84,8 +84,8 @@ def supports_async_opportunity_search(self) -> bool:
return self._search_opportunities_async is not None and self._get_opportunity_collection is not None

@property
def constraints(self) -> type[Constraints]:
return self._constraints
def queryables(self) -> type[Queryables]:
return self._queryables

@property
def opportunity_properties(self) -> type[OpportunityProperties]:
Expand Down
34 changes: 17 additions & 17 deletions stapi-fastapi/src/stapi_fastapi/routers/product_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,16 @@
)

from stapi_fastapi.constants import TYPE_JSON
from stapi_fastapi.exceptions import ConstraintsException, NotFoundException
from stapi_fastapi.exceptions import NotFoundException, QueryablesException
from stapi_fastapi.models.product import Product
from stapi_fastapi.responses import GeoJSONResponse
from stapi_fastapi.routers.route_names import (
CONFORMANCE,
CREATE_ORDER,
GET_CONSTRAINTS,
GET_OPPORTUNITY_COLLECTION,
GET_ORDER_PARAMETERS,
GET_PRODUCT,
GET_QUERYABLES,
SEARCH_OPPORTUNITIES,
)

Expand Down Expand Up @@ -103,11 +103,11 @@ def __init__(
)

self.add_api_route(
path="/constraints",
endpoint=self.get_product_constraints,
name=f"{self.root_router.name}:{self.product.id}:{GET_CONSTRAINTS}",
path="/queryables",
endpoint=self.get_product_queryables,
name=f"{self.root_router.name}:{self.product.id}:{GET_QUERYABLES}",
methods=["GET"],
summary="Get constraints for the product",
summary="Get queryables for the product",
tags=["Products"],
)

Expand Down Expand Up @@ -156,7 +156,7 @@ async def _create_order(
name=f"{self.root_router.name}:{self.product.id}:{SEARCH_OPPORTUNITIES}",
methods=["POST"],
response_class=GeoJSONResponse,
# unknown why mypy can't see the constraints property on Product, ignoring
# unknown why mypy can't see the queryables property on Product, ignoring
response_model=OpportunityCollection[
Geometry,
self.product.opportunity_properties, # type: ignore
Expand Down Expand Up @@ -205,10 +205,10 @@ def get_product(self, request: Request) -> ProductPydantic:
Link(
href=str(
request.url_for(
f"{self.root_router.name}:{self.product.id}:{GET_CONSTRAINTS}",
f"{self.root_router.name}:{self.product.id}:{GET_QUERYABLES}",
),
),
rel="constraints",
rel="queryables",
type=TYPE_JSON,
),
Link(
Expand Down Expand Up @@ -255,7 +255,7 @@ async def search_opportunities(
prefer: Prefer | None = Depends(get_prefer),
) -> OpportunityCollection | Response: # type: ignore
"""
Explore the opportunities available for a particular set of constraints
Explore the opportunities available for a particular set of queryables
"""
# sync
if not self.root_router.supports_async_opportunity_search or (
Expand Down Expand Up @@ -300,7 +300,7 @@ async def search_opportunities_sync(
links.append(self.pagination_link(request, search, x))
case Maybe.empty:
pass
case Failure(e) if isinstance(e, ConstraintsException):
case Failure(e) if isinstance(e, QueryablesException):
raise e
case Failure(e):
logger.error(
Expand Down Expand Up @@ -339,7 +339,7 @@ async def search_opportunities_async(
content=search_record.model_dump(mode="json"),
headers=headers,
)
case Failure(e) if isinstance(e, ConstraintsException):
case Failure(e) if isinstance(e, QueryablesException):
raise e
case Failure(e):
logger.error(
Expand All @@ -359,15 +359,15 @@ def get_product_conformance(self) -> Conformance:
"""
return Conformance.model_validate({"conforms_to": self.product.conformsTo})

def get_product_constraints(self) -> JsonSchemaModel:
def get_product_queryables(self) -> JsonSchemaModel:
"""
Return supported constraints of a specific product
Return supported queryables of a specific product
"""
return self.product.constraints
return self.product.queryables

def get_product_order_parameters(self) -> JsonSchemaModel:
"""
Return supported constraints of a specific product
Return supported order parameters of a specific product
"""
return self.product.order_parameters

Expand All @@ -385,7 +385,7 @@ async def create_order(self, payload: OrderPayload, request: Request, response:
location = str(self.root_router.generate_order_href(request, order.id))
response.headers["Location"] = location
return order # type: ignore
case Failure(e) if isinstance(e, ConstraintsException):
case Failure(e) if isinstance(e, QueryablesException):
raise e
case Failure(e):
logger.error(
Expand Down
2 changes: 1 addition & 1 deletion stapi-fastapi/src/stapi_fastapi/routers/route_names.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
LIST_PRODUCTS = "list-products"
LIST_PRODUCTS = "list-products"
GET_PRODUCT = "get-product"
GET_CONSTRAINTS = "get-constraints"
GET_QUERYABLES = "get-queryables"
GET_ORDER_PARAMETERS = "get-order-parameters"

# Opportunity
Expand Down
12 changes: 6 additions & 6 deletions stapi-fastapi/tests/shared.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ def put_opportunity_collection(self, collection: OpportunityCollection) -> None:
self._collections[collection.id] = deepcopy(collection)


class MyProductConstraints(BaseModel):
class MyProductQueryables(BaseModel):
off_nadir: int


Expand Down Expand Up @@ -134,7 +134,7 @@ class MyOrderParameters(OrderParameters):
search_opportunities=None,
search_opportunities_async=None,
get_opportunity_collection=None,
constraints=MyProductConstraints,
queryables=MyProductQueryables,
opportunity_properties=MyOpportunityProperties,
order_parameters=MyOrderParameters,
)
Expand All @@ -151,7 +151,7 @@ class MyOrderParameters(OrderParameters):
search_opportunities=mock_search_opportunities,
search_opportunities_async=None,
get_opportunity_collection=None,
constraints=MyProductConstraints,
queryables=MyProductQueryables,
opportunity_properties=MyOpportunityProperties,
order_parameters=MyOrderParameters,
)
Expand All @@ -169,7 +169,7 @@ class MyOrderParameters(OrderParameters):
search_opportunities=None,
search_opportunities_async=mock_search_opportunities_async,
get_opportunity_collection=mock_get_opportunity_collection,
constraints=MyProductConstraints,
queryables=MyProductQueryables,
opportunity_properties=MyOpportunityProperties,
order_parameters=MyOrderParameters,
)
Expand All @@ -186,7 +186,7 @@ class MyOrderParameters(OrderParameters):
search_opportunities=mock_search_opportunities,
search_opportunities_async=mock_search_opportunities_async,
get_opportunity_collection=mock_get_opportunity_collection,
constraints=MyProductConstraints,
queryables=MyProductQueryables,
opportunity_properties=MyOpportunityProperties,
order_parameters=MyOrderParameters,
)
Expand All @@ -203,7 +203,7 @@ class MyOrderParameters(OrderParameters):
search_opportunities=mock_search_opportunities,
search_opportunities_async=None,
get_opportunity_collection=None,
constraints=MyProductConstraints,
queryables=MyProductQueryables,
opportunity_properties=MyOpportunityProperties,
order_parameters=MyOrderParameters,
)
Expand Down
12 changes: 6 additions & 6 deletions stapi-fastapi/tests/test_product.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def test_product_response_links(
assert_link(
url, body, "conformance", f"/products/{product_id}/conformance"
) # https://github.com/stapi-spec/stapi-spec/issues/253
assert_link(url, body, "constraints", f"/products/{product_id}/constraints")
assert_link(url, body, "queryables", f"/products/{product_id}/queryables")
assert_link(url, body, "order-parameters", f"/products/{product_id}/order-parameters")
assert_link(url, body, "opportunities", f"/products/{product_id}/opportunities")
assert_link(url, body, "create-order", f"/products/{product_id}/orders", method="POST")
Expand All @@ -47,7 +47,7 @@ def test_product_conformance_response(
product_id: str,
stapi_client: TestClient,
):
res = stapi_client.get(f"/products/{product_id}/constraints")
res = stapi_client.get(f"/products/{product_id}/conformance")
assert res.status_code == status.HTTP_200_OK
assert res.headers["Content-Type"] == "application/json"

Expand All @@ -56,11 +56,11 @@ def test_product_conformance_response(


@pytest.mark.parametrize("product_id", ["test-spotlight"])
def test_product_constraints_response(
def test_product_queryables_response(
product_id: str,
stapi_client: TestClient,
):
res = stapi_client.get(f"/products/{product_id}/constraints")
res = stapi_client.get(f"/products/{product_id}/queryables")
assert res.status_code == status.HTTP_200_OK
assert res.headers["Content-Type"] == "application/json"

Expand Down Expand Up @@ -106,8 +106,8 @@ def test_get_products_pagination(
"type": "application/json",
},
{
"href": f"http://stapiserver/products/{product_id}/constraints",
"rel": "constraints",
"href": f"http://stapiserver/products/{product_id}/queryables",
"rel": "queryables",
"type": "application/json",
},
{
Expand Down
1 change: 1 addition & 0 deletions stapi-pydantic/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),

### Changed

- `s/constraints/queryables/` ([#74](https://github.com/stapi-spec/pystapi/pull/74))
- `s/canceled/cancelled/` ([#75](https://github.com/stapi-spec/pystapi/pull/75))

## [0.0.2] - 2025-04-02
Expand Down
4 changes: 2 additions & 2 deletions stapi-pydantic/src/stapi_pydantic/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from .conformance import Conformance
from .constraints import Constraints
from .datetime_interval import DatetimeInterval
from .filter import CQL2Filter
from .json_schema_model import JsonSchemaModel
Expand All @@ -26,12 +25,12 @@
OrderStatuses,
)
from .product import Product, ProductsCollection, Provider, ProviderRole
from .queryables import Queryables
from .root import RootResponse
from .shared import Link

__all__ = [
"Conformance",
"Constraints",
"CQL2Filter",
"DatetimeInterval",
"JsonSchemaModel",
Expand All @@ -58,5 +57,6 @@
"ProductsCollection",
"Provider",
"ProviderRole",
"Queryables",
"RootResponse",
]
4 changes: 1 addition & 3 deletions stapi-pydantic/src/stapi_pydantic/product.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
from enum import StrEnum
from typing import Any, Literal, Self, TypeAlias
from typing import Any, Literal, Self

from pydantic import AnyHttpUrl, BaseModel, Field

from .constants import STAPI_VERSION
from .shared import Link

Constraints: TypeAlias = BaseModel


class ProviderRole(StrEnum):
licensor = "licensor"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from pydantic import BaseModel, ConfigDict


class Constraints(BaseModel):
class Queryables(BaseModel):
model_config = ConfigDict(extra="allow")