Skip to content

Commit 49c3f4d

Browse files
authored
Add async analog of default paginate (#1039)
1 parent 7565c9a commit 49c3f4d

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from typing import Any, Callable, Optional, Sequence, TypeVar
2+
3+
__all__ = ["paginate"]
4+
5+
from .api import apply_items_transformer, create_page
6+
from .bases import AbstractParams
7+
from .types import AdditionalData, SyncItemsTransformer
8+
from .utils import check_installed_extensions, verify_params
9+
10+
T = TypeVar("T")
11+
12+
13+
# same as default paginator, but allow to use async transformer
14+
async def paginate(
15+
sequence: Sequence[T],
16+
params: Optional[AbstractParams] = None,
17+
length_function: Callable[[Sequence[T]], int] = len,
18+
*,
19+
safe: bool = False,
20+
transformer: Optional[SyncItemsTransformer] = None,
21+
additional_data: Optional[AdditionalData] = None,
22+
) -> Any:
23+
if not safe:
24+
check_installed_extensions()
25+
26+
params, raw_params = verify_params(params, "limit-offset")
27+
28+
items = sequence[raw_params.as_slice()]
29+
t_items = await apply_items_transformer(items, transformer, async_=True)
30+
31+
return create_page(
32+
t_items,
33+
total=length_function(sequence) if raw_params.include_total else None,
34+
params=params,
35+
**(additional_data or {}),
36+
)

tests/test_async_paginator.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from fastapi import FastAPI
2+
from pytest import fixture
3+
4+
from fastapi_pagination import (
5+
LimitOffsetPage,
6+
Page,
7+
add_pagination,
8+
)
9+
from fastapi_pagination.async_paginator import paginate
10+
11+
from .base import BasePaginationTestCase
12+
from .utils import OptionalLimitOffsetPage, OptionalPage
13+
14+
15+
class TestAsyncPaginationParams(BasePaginationTestCase):
16+
@fixture(scope="session")
17+
def app(self, model_cls, entities):
18+
app = FastAPI()
19+
20+
@app.get("/default", response_model=Page[model_cls])
21+
@app.get("/limit-offset", response_model=LimitOffsetPage[model_cls])
22+
@app.get("/optional/default", response_model=OptionalPage[model_cls])
23+
@app.get("/optional/limit-offset", response_model=OptionalLimitOffsetPage[model_cls])
24+
async def route():
25+
return await paginate(entities)
26+
27+
return add_pagination(app)

0 commit comments

Comments
 (0)