Skip to content

Commit 48c4dea

Browse files
rename filter to filter_expr to avoid python method conflict (#784)
1 parent e3c138c commit 48c4dea

File tree

6 files changed

+38
-34
lines changed

6 files changed

+38
-34
lines changed

CHANGES.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
## Changed
66

77
* use `string` type instead of python `datetime.datetime` for datetime parameter in `BaseSearchGetRequest`, `ItemCollectionUri` and `BaseCollectionSearchGetRequest` GET models
8+
* rename `filter` to `filter_expr` for `FilterExtensionGetRequest` and `FilterExtensionPostRequest` attributes to avoid conflict with python filter method
89

910
## [3.0.5] - 2025-01-10
1011

stac_fastapi/api/tests/test_app.py

+5-14
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ def post_search(
126126
self, search_request: BaseSearchPostRequest, **kwargs
127127
) -> stac.ItemCollection:
128128
search_request.collections = ["test"]
129-
search_request.filter = {}
129+
search_request.filter_expr = {}
130130
search_request.filter_crs = "EPSG:4326"
131131
search_request.filter_lang = "cql2-text"
132132

@@ -142,23 +142,14 @@ def get_search(
142142
intersects: Optional[str] = None,
143143
datetime: Optional[str] = None,
144144
limit: Optional[int] = 10,
145-
filter: Optional[str] = None,
145+
filter_expr: Optional[str] = None,
146146
filter_crs: Optional[str] = None,
147147
filter_lang: Optional[str] = None,
148148
**kwargs,
149149
) -> stac.ItemCollection:
150-
# Check if all filter parameters are passed correctly
151-
152-
assert filter == "TEST"
153-
154-
# FIXME: https://github.com/stac-utils/stac-fastapi/issues/638
155-
# hyphen alias for filter_crs and filter_lang are currently not working
156-
# Query parameters `filter-crs` and `filter-lang`
157-
# should be recognized by the API
158-
# They are present in the `request.query_params` but not in the `kwargs`
159-
160-
# assert filter_crs == "EPSG:4326"
161-
# assert filter_lang == "cql2-text"
150+
assert filter_expr == "TEST"
151+
assert filter_crs == "EPSG:4326"
152+
assert filter_lang == "cql2-text"
162153

163154
return stac.ItemCollection(
164155
type="FeatureCollection", features=[stac.Item(**item_dict)]

stac_fastapi/api/tests/test_models.py

+16-10
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,13 @@ def test_create_get_request_model():
2828
),
2929
datetime="2020-01-01T00:00:00.00001Z",
3030
limit=10,
31-
filter="test==test",
31+
filter_expr="test==test",
3232
filter_crs="epsg:4326",
3333
filter_lang="cql2-text",
3434
)
3535

3636
assert model.collections == ["test1", "test2"]
37+
assert model.filter_expr == "test==test"
3738
assert model.filter_crs == "epsg:4326"
3839
d = model.start_date
3940
assert d.microsecond == 10
@@ -64,13 +65,15 @@ def route(model=Depends(request_model)):
6465
"/test",
6566
params={
6667
"collections": "test1,test2",
68+
"filter": "test=test",
6769
"filter-crs": "epsg:4326",
6870
"filter-lang": "cql2-text",
6971
},
7072
)
7173
assert resp.status_code == 200
7274
response_dict = resp.json()
7375
assert response_dict["collections"] == ["test1", "test2"]
76+
assert response_dict["filter_expr"] == "test=test"
7477
assert response_dict["filter_crs"] == "epsg:4326"
7578
assert response_dict["filter_lang"] == "cql2-text"
7679

@@ -89,19 +92,22 @@ def test_create_post_request_model(filter_val, passes):
8992
with pytest.raises(ValidationError):
9093
model = request_model(filter=filter_val)
9194
else:
92-
model = request_model(
93-
collections=["test1", "test2"],
94-
ids=["test1", "test2"],
95-
bbox=[0, 0, 1, 1],
96-
datetime="2020-01-01T00:00:00.00001Z",
97-
limit=10,
98-
filter=filter_val,
99-
**{"filter-crs": "epsg:4326", "filter-lang": "cql2-json"},
95+
model = request_model.model_validate(
96+
{
97+
"collections": ["test1", "test2"],
98+
"ids": ["test1", "test2"],
99+
"bbox": [0, 0, 1, 1],
100+
"datetime": "2020-01-01T00:00:00.00001Z",
101+
"limit": 10,
102+
"filter": filter_val,
103+
"filter-crs": "epsg:4326",
104+
"filter-lang": "cql2-json",
105+
}
100106
)
101107

102108
assert model.collections == ["test1", "test2"]
109+
assert model.filter_expr == filter_val
103110
assert model.filter_crs == "epsg:4326"
104-
assert model.filter == filter_val
105111
assert model.datetime == "2020-01-01T00:00:00.00001Z"
106112

107113
with pytest.raises(ValidationError):

stac_fastapi/extensions/stac_fastapi/extensions/core/filter/request.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616
class FilterExtensionGetRequest(APIRequest):
1717
"""Filter extension GET request model."""
1818

19-
filter: Annotated[
19+
filter_expr: Annotated[
2020
Optional[str],
2121
Query(
22+
alias="filter",
2223
description="""A CQL filter expression for filtering items.\n
2324
Supports `CQL-JSON` as defined in https://portal.ogc.org/files/96288\n
2425
Remember to URL encode the CQL-JSON if using GET""",
@@ -46,8 +47,9 @@ class FilterExtensionGetRequest(APIRequest):
4647
class FilterExtensionPostRequest(BaseModel):
4748
"""Filter extension POST request model."""
4849

49-
filter: Optional[Dict[str, Any]] = Field(
50+
filter_expr: Optional[Dict[str, Any]] = Field(
5051
default=None,
52+
alias="filter",
5153
description="A CQL filter expression for filtering items.",
5254
json_schema_extra={
5355
"example": {

stac_fastapi/extensions/tests/test_collection_search.py

+8-6
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ def test_collection_search_extension_models():
185185
assert "datetime" in response_dict
186186
assert "limit" in response_dict
187187
assert "q" in response_dict
188-
assert "filter" in response_dict
188+
assert "filter_expr" in response_dict
189189
assert "query" in response_dict
190190
assert "sortby" in response_dict
191191
assert "fields" in response_dict
@@ -211,7 +211,9 @@ def test_collection_search_extension_models():
211211
assert "2020-06-13T13:00:00Z/2020-06-13T14:00:00Z" == response_dict["datetime"]
212212
assert 100 == response_dict["limit"]
213213
assert ["EO", "Earth Observation"] == response_dict["q"]
214-
assert "id='item_id' AND collection='collection_id'" == response_dict["filter"]
214+
assert (
215+
"id='item_id' AND collection='collection_id'" == response_dict["filter_expr"]
216+
)
215217
assert "filter_crs" in response_dict
216218
assert "cql2-text" in response_dict["filter_lang"]
217219
assert "query" in response_dict
@@ -347,7 +349,7 @@ def test_collection_search_extension_post_models():
347349
assert "datetime" in response_dict
348350
assert "limit" in response_dict
349351
assert "q" in response_dict
350-
assert "filter" in response_dict
352+
assert "filter_expr" in response_dict
351353
assert "query" in response_dict
352354
assert "sortby" in response_dict
353355
assert "fields" in response_dict
@@ -388,7 +390,7 @@ def test_collection_search_extension_post_models():
388390
assert "2020-06-13T13:00:00Z/2020-06-13T14:00:00Z" == response_dict["datetime"]
389391
assert 10_000 == response_dict["limit"]
390392
assert ["EO", "Earth Observation"] == response_dict["q"]
391-
assert response_dict["filter"]
393+
assert response_dict["filter_expr"]
392394
assert "filter_crs" in response_dict
393395
assert "cql2-json" in response_dict["filter_lang"]
394396
assert response_dict["query"]
@@ -433,7 +435,7 @@ def test_from_extensions_methods(extensions):
433435
assert hasattr(collection_search, "fields")
434436
assert hasattr(collection_search, "q")
435437
assert hasattr(collection_search, "sortby")
436-
assert hasattr(collection_search, "filter")
438+
assert hasattr(collection_search, "filter_expr")
437439
assert ext.conformance_classes == [
438440
ConformanceClasses.COLLECTIONSEARCH,
439441
ConformanceClasses.BASIS,
@@ -457,7 +459,7 @@ def test_from_extensions_methods(extensions):
457459
assert hasattr(collection_search, "fields")
458460
assert hasattr(collection_search, "q")
459461
assert hasattr(collection_search, "sortby")
460-
assert hasattr(collection_search, "filter")
462+
assert hasattr(collection_search, "filter_expr")
461463
assert ext.conformance_classes == [
462464
ConformanceClasses.COLLECTIONSEARCH,
463465
ConformanceClasses.BASIS,

stac_fastapi/extensions/tests/test_filter.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ def test_search_filter_post_filter_lang_default(client: TestClient):
5757
)
5858
assert response.is_success, response.json()
5959
response_dict = response.json()
60+
assert response_dict["filter_expr"]
6061
assert response_dict["filter_lang"] == "cql2-json"
6162

6263

@@ -73,6 +74,7 @@ def test_search_filter_post_filter_lang_non_default(client: TestClient):
7374
)
7475
assert response.is_success, response.json()
7576
response_dict = response.json()
77+
assert response_dict["filter_expr"]
7678
assert response_dict["filter_lang"] == filter_lang_value
7779

7880

@@ -87,7 +89,7 @@ def test_search_filter_get(client: TestClient):
8789
assert response.is_success, response.json()
8890
response_dict = response.json()
8991
assert not response_dict["collections"]
90-
assert response_dict["filter"] == "id='item_id' AND collection='collection_id'"
92+
assert response_dict["filter_expr"] == "id='item_id' AND collection='collection_id'"
9193
assert not response_dict["filter_crs"]
9294
assert response_dict["filter_lang"] == "cql2-text"
9395

@@ -102,7 +104,7 @@ def test_search_filter_get(client: TestClient):
102104
response_dict = response.json()
103105
assert not response_dict["collections"]
104106
assert (
105-
response_dict["filter"]
107+
response_dict["filter_expr"]
106108
== "{'op': '=', 'args': [{'property': 'id'}, 'test-item']}"
107109
)
108110
assert not response_dict["filter_crs"]

0 commit comments

Comments
 (0)