stac-fastapi.api 3.0.0b1__tar.gz → 3.0.0b2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/PKG-INFO +1 -1
  2. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/stac_fastapi/api/models.py +16 -21
  3. stac_fastapi_api-3.0.0b2/stac_fastapi/api/version.py +2 -0
  4. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/stac_fastapi.api.egg-info/PKG-INFO +1 -1
  5. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/tests/test_app.py +14 -13
  6. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/tests/test_models.py +17 -9
  7. stac_fastapi_api-3.0.0b1/stac_fastapi/api/version.py +0 -2
  8. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/README.md +0 -0
  9. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/setup.cfg +0 -0
  10. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/setup.py +0 -0
  11. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/stac_fastapi/api/__init__.py +0 -0
  12. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/stac_fastapi/api/app.py +0 -0
  13. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/stac_fastapi/api/config.py +0 -0
  14. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/stac_fastapi/api/errors.py +0 -0
  15. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/stac_fastapi/api/middleware.py +0 -0
  16. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/stac_fastapi/api/openapi.py +0 -0
  17. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/stac_fastapi/api/routes.py +0 -0
  18. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/stac_fastapi.api.egg-info/SOURCES.txt +0 -0
  19. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/stac_fastapi.api.egg-info/dependency_links.txt +0 -0
  20. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/stac_fastapi.api.egg-info/not-zip-safe +0 -0
  21. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/stac_fastapi.api.egg-info/requires.txt +0 -0
  22. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/stac_fastapi.api.egg-info/top_level.txt +0 -0
  23. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/tests/test_api.py +0 -0
  24. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/tests/test_app_prefix.py +0 -0
  25. {stac_fastapi_api-3.0.0b1 → stac_fastapi_api-3.0.0b2}/tests/test_middleware.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: stac-fastapi.api
3
- Version: 3.0.0b1
3
+ Version: 3.0.0b2
4
4
  Summary: An implementation of STAC API based on the FastAPI framework.
5
5
  Home-page: https://github.com/stac-utils/stac-fastapi
6
6
  Author: Arturo Engineering
@@ -1,8 +1,8 @@
1
1
  """Api request/response models."""
2
2
 
3
- from dataclasses import dataclass, make_dataclass
4
3
  from typing import List, Optional, Type, Union
5
4
 
5
+ import attr
6
6
  from fastapi import Path, Query
7
7
  from pydantic import BaseModel, create_model
8
8
  from stac_pydantic.shared import BBox
@@ -43,11 +43,11 @@ def create_request_model(
43
43
 
44
44
  mixins = mixins or []
45
45
 
46
- models = extension_models + mixins + [base_model]
46
+ models = [base_model] + extension_models + mixins
47
47
 
48
48
  # Handle GET requests
49
49
  if all([issubclass(m, APIRequest) for m in models]):
50
- return make_dataclass(model_name, [], bases=tuple(models))
50
+ return attr.make_class(model_name, attrs={}, bases=tuple(models))
51
51
 
52
52
  # Handle POST requests
53
53
  elif all([issubclass(m, BaseModel) for m in models]):
@@ -86,43 +86,38 @@ def create_post_request_model(
86
86
  )
87
87
 
88
88
 
89
- @dataclass
89
+ @attr.s
90
90
  class CollectionUri(APIRequest):
91
91
  """Get or delete collection."""
92
92
 
93
- collection_id: Annotated[str, Path(description="Collection ID")]
93
+ collection_id: Annotated[str, Path(description="Collection ID")] = attr.ib()
94
94
 
95
95
 
96
- @dataclass
96
+ @attr.s
97
97
  class ItemUri(APIRequest):
98
98
  """Get or delete item."""
99
99
 
100
- collection_id: Annotated[str, Path(description="Collection ID")]
101
- item_id: Annotated[str, Path(description="Item ID")]
100
+ collection_id: Annotated[str, Path(description="Collection ID")] = attr.ib()
101
+ item_id: Annotated[str, Path(description="Item ID")] = attr.ib()
102
102
 
103
103
 
104
- @dataclass
104
+ @attr.s
105
105
  class EmptyRequest(APIRequest):
106
106
  """Empty request."""
107
107
 
108
108
  ...
109
109
 
110
110
 
111
- @dataclass
111
+ @attr.s
112
112
  class ItemCollectionUri(APIRequest):
113
113
  """Get item collection."""
114
114
 
115
- collection_id: Annotated[str, Path(description="Collection ID")]
116
- limit: Annotated[int, Query()] = 10
117
- bbox: Annotated[Optional[BBox], Query()] = None
118
- datetime: Annotated[Optional[DateTimeType], Query()] = None
119
-
120
- def __post_init__(self):
121
- """convert attributes."""
122
- if self.bbox:
123
- self.bbox = str2bbox(self.bbox) # type: ignore
124
- if self.datetime:
125
- self.datetime = str_to_interval(self.datetime) # type: ignore
115
+ collection_id: Annotated[str, Path(description="Collection ID")] = attr.ib()
116
+ limit: Annotated[int, Query()] = attr.ib(default=10)
117
+ bbox: Annotated[Optional[BBox], Query()] = attr.ib(default=None, converter=str2bbox)
118
+ datetime: Annotated[Optional[DateTimeType], Query()] = attr.ib(
119
+ default=None, converter=str_to_interval
120
+ )
126
121
 
127
122
 
128
123
  class GeoJSONResponse(JSONResponse):
@@ -0,0 +1,2 @@
1
+ """Library version."""
2
+ __version__ = "3.0.0b2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: stac-fastapi.api
3
- Version: 3.0.0b1
3
+ Version: 3.0.0b2
4
4
  Summary: An implementation of STAC API based on the FastAPI framework.
5
5
  Home-page: https://github.com/stac-utils/stac-fastapi
6
6
  Author: Arturo Engineering
@@ -1,12 +1,13 @@
1
- from dataclasses import dataclass
2
1
  from datetime import datetime
3
2
  from typing import List, Optional, Union
4
3
 
4
+ import attr
5
5
  import pytest
6
6
  from fastapi import Path, Query
7
7
  from fastapi.testclient import TestClient
8
8
  from pydantic import ValidationError
9
9
  from stac_pydantic import api
10
+ from typing_extensions import Annotated
10
11
 
11
12
  from stac_fastapi.api import app
12
13
  from stac_fastapi.api.models import (
@@ -328,25 +329,25 @@ def test_fields_extension(validate, TestCoreClient, item_dict):
328
329
  def test_request_model(AsyncTestCoreClient):
329
330
  """Test if request models are passed correctly."""
330
331
 
331
- @dataclass
332
+ @attr.s
332
333
  class CollectionsRequest(APIRequest):
333
- user: str = Query(...)
334
+ user: Annotated[str, Query(...)] = attr.ib()
334
335
 
335
- @dataclass
336
+ @attr.s
336
337
  class CollectionRequest(APIRequest):
337
- collection_id: str = Path(description="Collection ID")
338
- user: str = Query(...)
338
+ collection_id: Annotated[str, Path(description="Collection ID")] = attr.ib()
339
+ user: Annotated[str, Query(...)] = attr.ib()
339
340
 
340
- @dataclass
341
+ @attr.s
341
342
  class ItemsRequest(APIRequest):
342
- collection_id: str = Path(description="Collection ID")
343
- user: str = Query(...)
343
+ collection_id: Annotated[str, Path(description="Collection ID")] = attr.ib()
344
+ user: Annotated[str, Query(...)] = attr.ib()
344
345
 
345
- @dataclass
346
+ @attr.s
346
347
  class ItemRequest(APIRequest):
347
- collection_id: str = Path(description="Collection ID")
348
- item_id: str = Path(description="Item ID")
349
- user: str = Query(...)
348
+ collection_id: Annotated[str, Path(description="Collection ID")] = attr.ib()
349
+ item_id: Annotated[str, Path(description="Item ID")] = attr.ib()
350
+ user: Annotated[str, Query(...)] = attr.ib()
350
351
 
351
352
  test_app = app.StacApi(
352
353
  settings=ApiSettings(),
@@ -1,19 +1,20 @@
1
1
  import json
2
2
 
3
3
  import pytest
4
- from fastapi import Depends, FastAPI
4
+ from fastapi import Depends, FastAPI, HTTPException
5
5
  from fastapi.testclient import TestClient
6
6
  from pydantic import ValidationError
7
7
 
8
8
  from stac_fastapi.api.models import create_get_request_model, create_post_request_model
9
- from stac_fastapi.extensions.core.filter.filter import FilterExtension
10
- from stac_fastapi.extensions.core.sort.sort import SortExtension
9
+ from stac_fastapi.extensions.core import FieldsExtension, FilterExtension, SortExtension
11
10
  from stac_fastapi.types.search import BaseSearchGetRequest, BaseSearchPostRequest
12
11
 
13
12
 
14
13
  def test_create_get_request_model():
15
- extensions = [FilterExtension()]
16
- request_model = create_get_request_model(extensions, BaseSearchGetRequest)
14
+ request_model = create_get_request_model(
15
+ extensions=[FilterExtension(), FieldsExtension()],
16
+ base_model=BaseSearchGetRequest,
17
+ )
17
18
 
18
19
  model = request_model(
19
20
  collections="test1,test2",
@@ -35,6 +36,9 @@ def test_create_get_request_model():
35
36
  assert model.collections == ["test1", "test2"]
36
37
  assert model.filter_crs == "epsg:4326"
37
38
 
39
+ with pytest.raises(HTTPException):
40
+ request_model(datetime="yo")
41
+
38
42
  app = FastAPI()
39
43
 
40
44
  @app.get("/test")
@@ -62,8 +66,10 @@ def test_create_get_request_model():
62
66
  [(None, True), ({"test": "test"}, True), ("test==test", False), ([], False)],
63
67
  )
64
68
  def test_create_post_request_model(filter, passes):
65
- extensions = [FilterExtension()]
66
- request_model = create_post_request_model(extensions, BaseSearchPostRequest)
69
+ request_model = create_post_request_model(
70
+ extensions=[FilterExtension(), FieldsExtension()],
71
+ base_model=BaseSearchPostRequest,
72
+ )
67
73
 
68
74
  if not passes:
69
75
  with pytest.raises(ValidationError):
@@ -100,8 +106,10 @@ def test_create_post_request_model(filter, passes):
100
106
  ],
101
107
  )
102
108
  def test_create_post_request_model_nested_fields(sortby, passes):
103
- extensions = [SortExtension()]
104
- request_model = create_post_request_model(extensions, BaseSearchPostRequest)
109
+ request_model = create_post_request_model(
110
+ extensions=[SortExtension()],
111
+ base_model=BaseSearchPostRequest,
112
+ )
105
113
 
106
114
  if not passes:
107
115
  with pytest.raises(ValidationError):
@@ -1,2 +0,0 @@
1
- """Library version."""
2
- __version__ = "3.0.0b1"