Pagination primitives for any ORM and web-frameworks
Project description
PaginateAny
Pagination primitives for any ORM and web-frameworks.
Known issues
- Decode and Encode of a cursor values hardcoded with
msgspec.msgpack
module. You can't use timezone-naive datetime format, because it converts value to thestr
type. See spec and issue about supported types.
Code example
from typing import Annotated
from datetime import datetime, timezone
from fastapi import FastAPI, Depends
from paginate_any.cursor_pagination import InMemoryCursorPaginator
from paginate_any.ext.fastapi import (
FastApiCursorPagination,
PaginationDependProtocol,
init_paginate_any_fastapi_app,
)
from paginate_any.rest_api import JsonPaginationResp
from pydantic import BaseModel
app = FastAPI()
init_paginate_any_fastapi_app(app)
class Car(BaseModel):
id: int
name: str
factory_start: datetime
paginator = InMemoryCursorPaginator[Car](
unq_field='id',
sort_fields={
'id': 'id',
'factory_start': 'factory_start',
},
default_size=2,
)
store = [
Car(id=1, name='BMW', factory_start=datetime(1916, 3, 7, tzinfo=timezone.utc)),
Car(id=2, name='Audi', factory_start=datetime(1909, 7, 16, tzinfo=timezone.utc)),
Car(id=3, name='Mercedes-Benz', factory_start=datetime(1926, 6, 28, tzinfo=timezone.utc)),
Car(id=4, name='Volkswagen', factory_start=datetime(1937, 5, 28, tzinfo=timezone.utc)),
Car(id=5, name='Porsche', factory_start=datetime(1931, 4, 25, tzinfo=timezone.utc)),
]
@app.get('/cars', response_model=JsonPaginationResp[Car])
async def cars(
p: Annotated[
PaginationDependProtocol[list[Car], Car],
Depends(FastApiCursorPagination.depend(paginator)),
],
):
result = await p.paginate(store)
return result.json_resp()
Request:
curl -X GET "http://127.0.0.1:8000/cars?ordering=factory_start" -H "accept: application/json"
Response:
{
"pagination": {
"size": 2,
"after": "kscM_wAAAAD_____msOxAAE="
},
"links": {
"next": "http://127.0.0.1:8000/cars?after=kscM_wAAAAD_____msOxAAE%3D&ordering=factory_start"
},
"data": [
{
"id": 2,
"name": "Audi",
"factory_start": "1909-07-16T00:00:00Z"
},
{
"id": 1,
"name": "BMW",
"factory_start": "1916-03-07T00:00:00Z"
}
]
}
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
paginate_any-0.0.2.tar.gz
(16.5 kB
view details)
Built Distribution
File details
Details for the file paginate_any-0.0.2.tar.gz
.
File metadata
- Download URL: paginate_any-0.0.2.tar.gz
- Upload date:
- Size: 16.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.2 CPython/3.11.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 182a4ea40f5402f80c485d0542cfd748e25eea045c2ece3d2dc37b906adb6cf7 |
|
MD5 | bf0d4ef6a91e9d97eab3025fca9dc094 |
|
BLAKE2b-256 | 311a2f41b8cbb95d99a2e39ce5729a1d983d88d2d31ec8731fcaa5d9891cb234 |
File details
Details for the file paginate_any-0.0.2-py3-none-any.whl
.
File metadata
- Download URL: paginate_any-0.0.2-py3-none-any.whl
- Upload date:
- Size: 21.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/4.0.2 CPython/3.11.7
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 42c3c876d00099e7f2ef8ee1544829453a86b6b2ee7241ed0f02607b0e55926e |
|
MD5 | f9f59db3491b5a40dd5fbbb9031ea556 |
|
BLAKE2b-256 | 059d486720bc265999780084c4d74aa396c0ec43afc477abd638ba817521a6b4 |