Compare commits

...

57 Commits
1.1.0 ... 2.0.2

Author SHA1 Message Date
807af12fa1 Merge pull request #13 from creyD/dev 2024-11-05 11:54:46 +01:00
creyD
dce897c247 Adjusted files for isort & autopep 2024-11-05 10:29:40 +00:00
vikynoah
89997372ef fix: Changes to accomodate pagination flag in Params (#14)
Co-authored-by: vikbhas <waraa.vignesh@gmail.com>
2024-11-05 11:29:06 +01:00
c8c5977978 fix: removed non-working backsync 2024-10-29 16:20:01 +01:00
974bc591d6 Merge pull request #11 from creyD/dev 2024-10-29 15:49:00 +01:00
eb895398ab fix: trying again to fix the pipeline 2024-10-29 15:46:52 +01:00
867abd7054 fix: fixed workflow again 2024-10-29 15:33:54 +01:00
26e18f6b31 Merge pull request #10 from creyD/dev 2024-10-29 15:32:28 +01:00
8a3a60dbb0 fix: fixed workflow again 2024-10-29 15:30:42 +01:00
e52a5f421b Merge pull request #9 from creyD/dev 2024-10-29 15:23:41 +01:00
a6ded91185 fix: syncing back tags to dev 2024-10-29 15:18:57 +01:00
eb64874c47 fix: minor adjustment to the pipeline 2024-10-29 15:13:36 +01:00
b7200852a4 Merge branch 'dev' of https://github.com/creyD/creyPY into dev 2024-10-29 15:13:30 +01:00
3d18205205 fix: fixed github pipeline 2024-10-29 15:12:41 +01:00
99c84b676c Merge pull request #8 from creyD/dev 2024-10-29 15:09:34 +01:00
6806de23b3 fix: fixed github pipeline 2024-10-29 15:06:31 +01:00
6a93ab05a3 Merge pull request #6 from creyD/dev 2024-10-29 14:56:14 +01:00
vikynoah
c5b2ab9932 fix: Add condition for total greater than zero (#7) 2024-10-28 15:37:14 +01:00
5a32a5908b Removed debug statement 2024-10-25 15:34:16 +02:00
b7df0bfdcd fix: added escape for variable names 2024-10-25 15:27:50 +02:00
378d1d60f1 fix: adjusting pipeline for prod as well 2024-10-25 15:22:35 +02:00
e381992f8e fix: fixing dev versioning 2024-10-25 15:09:15 +02:00
6d5411a8ae fix: debugging pipeline 2024-10-25 14:46:35 +02:00
89351d714b fix: debugging pipeline 2024-10-25 14:44:18 +02:00
c24f8933fb fix: attempt on fixing the versioning issue 2024-10-25 14:38:58 +02:00
0bed0e0da4 fix: attempt on fixing the versioning issue 2024-10-25 14:34:56 +02:00
8463eef907 fix: attempt on fixing the versioning issue 2024-10-25 14:25:48 +02:00
5903de2aad fix: fixed semantic versioning format selector 2024-10-25 14:19:11 +02:00
0bf89fe14d fix: switched to semantic versioning action 2024-10-25 14:12:04 +02:00
d54146e05b fix: fixed naming of pre-release commits 2024-10-24 12:41:04 +02:00
d6f79c3ed8 fix: fixed naming of pre-release commits 2024-10-24 12:35:13 +02:00
3f4a0ee00d fix: fixed naming of pre-release commits 2024-10-24 12:25:30 +02:00
714178d68f fix: fixed naming of pre-release commits 2024-10-24 12:22:45 +02:00
c7e205f14b fix: fixed naming of pre-release commits 2024-10-24 12:18:50 +02:00
39ae74becb fix: minor changelog adjustment 2024-10-24 12:15:23 +02:00
5f39966223 fix: Fixed tag pushing and changelog 2024-10-24 12:10:16 +02:00
c91e684f08 fix: fix attempt for the github pipeline 2024-10-24 12:10:16 +02:00
f11b8b8864 fix: alternative attempt on the fix 2024-10-24 12:10:16 +02:00
983553e97a fix: locked tag and publish to master and dev 2024-10-24 12:10:16 +02:00
8740eafce2 fix: fixed pipeline tagging 2024-10-24 12:10:16 +02:00
aa44b9ebe9 fix: fixed pipeline tagging 2024-10-24 12:10:16 +02:00
851573d964 fix: fixed pipeline tagging 2024-10-24 12:10:16 +02:00
cfa1da08d3 fix: pipeline now pushes pre-release versions 2024-10-24 12:10:16 +02:00
4a5a777ef5 breaking: Fixed #3 2024-10-24 12:10:16 +02:00
c9a9b1bc0a breaking: Fixed #1 2024-10-24 12:10:16 +02:00
d9f6e82736 Merge pull request #5 from creyD/dev
Co-authored-by: vikbhas <waraa.vignesh@gmail.com>
Co-authored-by: vikynoah <vigneshwaraa.sarangapani@noah.tech>
Co-authored-by: creyD <creyD@users.noreply.github.com>
2024-10-24 11:04:12 +02:00
65e93a023b fix: minor vscode adjustments 2024-10-24 09:32:11 +02:00
creyD
6ce0cfbd14 Adjusted files for isort & autopep 2024-10-24 07:27:26 +00:00
vikynoah
da7ec0b28e Feat: Addition of pagination proxy and Flag functionality (#4)
Co-authored-by: vikbhas <waraa.vignesh@gmail.com>
2024-10-24 09:26:57 +02:00
2727c452b6 fix: adjusted pipeline to dev branch and pull requests 2024-10-24 09:25:39 +02:00
be7d7ddb22 fix: bumped dependencies 2024-07-14 18:24:07 +02:00
3f0379290d fix: Dependencies can now be installed with newer versions 2024-05-14 14:40:12 +02:00
creyD
fa7a1c8a61 Adjusted files for isort & autopep 2024-05-13 09:22:06 +00:00
5a7e1776db fix: Added option to specify lookup_column for get_object_or_404 2024-05-13 11:21:25 +02:00
4c25d91e18 fix: fixed another minor bug with the order_by method 2024-04-25 19:43:12 +02:00
f24db62781 fix: fixed a bug with the jsonschema for order_by 2024-04-25 18:44:58 +02:00
4d997a375e feat: added order_by method 2024-04-25 18:19:26 +02:00
8 changed files with 210 additions and 64 deletions

View File

@@ -4,12 +4,15 @@ on:
push:
branches:
- master
- dev
paths-ignore:
- "**/.github/**"
- "**/.gitignore"
- "**/.vscode/**"
- "**/README.md"
- "**/CHANGELOG.md"
pull_request:
branches:
- dev
workflow_dispatch:
jobs:
@@ -42,6 +45,7 @@ jobs:
tag_and_publish:
runs-on: ubuntu-latest
if: github.ref_name == 'master' || github.ref_name == 'dev'
needs: test
permissions:
id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
@@ -51,7 +55,7 @@ jobs:
- uses: actions/checkout@v4
with:
fetch-tags: true
ref: ${{ github.ref }}
ref: ${{ github.ref_name }}
fetch-depth: 0
- name: setup git
@@ -59,18 +63,29 @@ jobs:
git config --local user.email "15138480+creyD@users.noreply.github.com"
git config --local user.name "creyD"
- name: set version format
id: version_format
run: |
if [[ ${{ github.ref_name }} == 'master' ]]; then
echo "version_format=\${major}.\${minor}.\${patch}" >> $GITHUB_OUTPUT
else
echo "version_format=\${major}.\${minor}.\${patch}rc\${increment}" >> $GITHUB_OUTPUT
fi
- name: Git Version
uses: codacy/git-version@2.8.0
uses: PaulHatch/semantic-version@v5.4.0
id: git_version
with:
minor-identifier: "feat:"
major-identifier: "breaking:"
tag_prefix: ""
major_pattern: "breaking:"
minor_pattern: "feat:"
enable_prerelease_mode: false
version_format: ${{ steps.version_format.outputs.version_format }}
- name: Create Tag
run: git tag ${{ steps.git_version.outputs.version }}
- name: Push tag
run: git push origin ${{ steps.git_version.outputs.version }}
- name: Create & Push Tag
run: |
git tag ${{ steps.git_version.outputs.version }}
git push origin ${{ steps.git_version.outputs.version }}
- name: Set up Python
uses: actions/setup-python@v5

View File

@@ -26,10 +26,16 @@
"**/db.sqlite3": true,
"**/.DS_Store": true,
"**/*.pyc": true,
"**/__pycache__/": true
"**/__pycache__/": true,
"**/build": true,
"**/dist": true,
"**/*.egg-info": true,
},
"search.exclude": {
"**/.git": true,
"**/build": true,
"**/*.egg-info": true,
"**/dist": true,
"**/.venv": true,
"**/tmp": true,
"htmlcov/*": true,

View File

@@ -2,6 +2,37 @@
All notable changes to this project will be documented in this file.
## 2.0.0
- Fixed #1 Rename misspelled additonal_data to additional_data on create_obj_from_data
- Fixed #3 Inverse partial flag: bool = False because it was wrong on update_obj_from_data
Notes:
You will need to change calls to `create_obj_from_data` according to #1 (rename additonal_data to additional_data)
You will need to change calls to `update_obj_from_data` according to #3 (if you supplied `partial`, you will need to reverse it: `true` -> `false` and `false` -> `true`)
## 1.3.0
- Addition of pagination proxy and pagination=off functionality (Thanks to @vikbhas)
## 1.2.5
- Bumped dependencies
## 1.2.4
- Enabled newer versions for all dependencies
## 1.2.3
- Added option to specify lookup_column for get_object_or_404
## 1.2.2
- Added order_by method
## 1.1.0
- Added headers to testing

View File

@@ -10,8 +10,10 @@ from .models.base import Base
T = TypeVar("T", bound=Base)
def get_object_or_404(db_class: Type[T], id: UUID | str, db: Session, expunge: bool = False) -> T:
obj = db.query(db_class).filter(db_class.id == id).one_or_none()
def get_object_or_404(
db_class: Type[T], id: UUID | str, db: Session, expunge: bool = False, lookup_column: str = "id"
) -> T:
obj = db.query(db_class).filter(getattr(db_class, lookup_column) == id).one_or_none()
if obj is None:
raise HTTPException(status_code=404, detail="The object does not exist.")
if expunge:
@@ -21,9 +23,9 @@ def get_object_or_404(db_class: Type[T], id: UUID | str, db: Session, expunge: b
# TODO: Add testing
def create_obj_from_data(
data: BaseModel, model: Type[T], db: Session, additonal_data={}, exclude={}
data: BaseModel, model: Type[T], db: Session, additional_data={}, exclude={}
) -> T:
obj = model(**data.model_dump(exclude=exclude) | additonal_data)
obj = model(**data.model_dump(exclude=exclude) | additional_data)
db.add(obj)
db.commit()
db.refresh(obj)
@@ -36,13 +38,13 @@ def update_obj_from_data(
model: Type[T],
id: UUID | str,
db: Session,
partial: bool = False,
partial: bool = True,
ignore_fields=[],
additional_data={},
exclude={},
) -> T:
obj = get_object_or_404(model, id, db)
data_dict = data.model_dump(exclude_unset=not partial, exclude=exclude)
data_dict = data.model_dump(exclude_unset=partial, exclude=exclude)
data_dict.update(additional_data) # merge additional_data into data_dict
for field in data_dict:
if field not in ignore_fields:

View File

@@ -0,0 +1,25 @@
from typing import Callable
from pydantic.json_schema import SkipJsonSchema
from sqlalchemy import String, asc, cast, desc
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.sql.selectable import Select
def order_by(order_by: str | SkipJsonSchema[None] = None) -> Callable[[Select], Select]:
def _order_by(query: Select) -> Select:
if order_by:
direction = desc if order_by.startswith("-") else asc
column_name = order_by.lstrip("-")
# Get the column from the query
for column in query.inner_columns:
if column.key == column_name:
# If the column is a UUID, cast it to a string
if isinstance(column.type, UUID):
column = cast(column, String)
query = query.order_by(direction(column))
break
return query
return _order_by

View File

@@ -1,14 +1,39 @@
from math import ceil
from typing import Any, Generic, Optional, Self, Sequence, TypeVar
from typing import Any, Generic, Optional, Self, Sequence, TypeVar, Union
from pydantic import BaseModel
from fastapi_pagination import Params
from fastapi_pagination.bases import AbstractPage, AbstractParams
from fastapi_pagination.types import GreaterEqualOne, GreaterEqualZero
from fastapi_pagination.types import (
GreaterEqualOne,
GreaterEqualZero,
AdditionalData,
SyncItemsTransformer,
)
from fastapi_pagination.api import create_page, apply_items_transformer
from fastapi_pagination.utils import verify_params
from fastapi_pagination.ext.sqlalchemy import create_paginate_query
from fastapi_pagination.bases import AbstractParams, RawParams
from pydantic.json_schema import SkipJsonSchema
from sqlalchemy.sql.selectable import Select
from sqlalchemy.orm.session import Session
from sqlalchemy import select, func
from fastapi import Query
T = TypeVar("T")
class PaginationParams(BaseModel, AbstractParams):
page: int = Query(1, ge=1, description="Page number")
size: int = Query(50, ge=1, le=100, description="Page size")
pagination: bool = Query(True, description="Toggle pagination")
def to_raw_params(self) -> RawParams:
if not self.pagination:
return RawParams(limit=None, offset=None)
return RawParams(limit=self.size, offset=(self.page - 1) * self.size)
# TODO: Add complete fastapi-pagination proxy here
# TODO: Add pagination off functionality
# SkipJsonSchema is used to avoid generating invalid JSON schema in FastAPI
@@ -21,7 +46,7 @@ class Page(AbstractPage[T], Generic[T]):
has_next: bool | SkipJsonSchema[None] = None
has_prev: bool | SkipJsonSchema[None] = None
__params_type__ = Params
__params_type__ = PaginationParams
@classmethod
def create(
@@ -70,3 +95,45 @@ def parse_page(response, page: int, size: int) -> Page:
has_next=response.has_next,
has_prev=response.has_prev,
)
def create_count_query(query: Select) -> Select:
return select(func.count()).select_from(query.subquery())
def unwrap_scalars(
items: Sequence[Sequence[T]],
force_unwrap: bool = True,
) -> Union[Sequence[T], Sequence[Sequence[T]]]:
return [item[0] if force_unwrap else item for item in items]
def paginate(
connection: Session,
query: Select,
params: Optional[AbstractParams] = None,
transformer: Optional[SyncItemsTransformer] = None,
additional_data: Optional[AdditionalData] = None,
):
params, raw_params = verify_params(params, "limit-offset", "cursor")
count_query = create_count_query(query)
total = connection.scalar(count_query)
if params.pagination is False and total > 0:
params = Params(page=1, size=total)
else:
params = Params(page=params.page, size=params.size)
query = create_paginate_query(query, params)
items = connection.execute(query).all()
items = unwrap_scalars(items)
t_items = apply_items_transformer(items, transformer)
return create_page(
t_items,
params=params,
total=total,
**(additional_data or {}),
)

View File

@@ -1,27 +1,27 @@
certifi==2024.2.2
charset-normalizer==3.3.2
docutils==0.20.1
idna==3.6
importlib_metadata==7.1.0
jaraco.classes==3.4.0
jaraco.context==4.3.0
jaraco.functools==4.0.0
keyring==25.0.0
markdown-it-py==3.0.0
mdurl==0.1.2
more-itertools==10.2.0
nh3==0.2.17
pkginfo==1.10.0
Pygments==2.17.2
readme_renderer==43.0
requests==2.31.0
requests-toolbelt==1.0.0
rfc3986==2.0.0
rich==13.7.1
setuptools==69.2.0
twine==5.0.0
urllib3==2.2.1
wheel==0.43.0
zipp==3.18.1
certifi>=2024.2.2
charset-normalizer>=3.3.2
docutils>=0.20.1
idna>=3.6
importlib_metadata>=7.1.0
jaraco.classes>=3.4.0
jaraco.context>=4.3.0
jaraco.functools>=4.0.0
keyring>=25.0.0
markdown-it-py>=3.0.0
mdurl>=0.1.2
more-itertools>=10.2.0
nh3>=0.2.17
pkginfo>=1.10.0
Pygments>=2.17.2
readme_renderer>=43.0
requests>=2.31.0
requests-toolbelt>=1.0.0
rfc3986>=2.0.0
rich>=13.7.1
setuptools>=69.2.0
twine>=5.0.0
urllib3>=2.2.1
wheel>=0.43.0
zipp>=3.18.1
-r requirements.txt

View File

@@ -1,23 +1,23 @@
annotated-types==0.6.0 # Pydantic
pydantic==2.6.4 # Pydantic
pydantic-core==2.16.3 # Pydantic
typing-extensions==4.10.0 # Pydantic
annotated-types>=0.7.0 # Pydantic
pydantic>=2.8.2 # Pydantic
pydantic-core>=2.20.1 # Pydantic
typing-extensions>=4.12.2 # Pydantic
anyio==4.3.0 # FastAPI
fastapi==0.110.1 # FastAPI
idna==3.6 # FastAPI
sniffio==1.3.1 # FastAPI
starlette==0.37.2 # FastAPI
anyio>=4.4.0 # FastAPI
fastapi>=0.111.0 # FastAPI
idna>=3.7 # FastAPI
sniffio>=1.3.1 # FastAPI
starlette>=0.37.2 # FastAPI
fastapi-pagination==0.12.21 # Pagination
sqlalchemy==2.0.29 # SQLAlchemy
fastapi-pagination>=0.12.26 # Pagination
sqlalchemy>=2.0.31 # SQLAlchemy
python-dotenv==1.0.1 # Environment variables
python-dotenv>=1.0.1 # Environment variables
psycopg==3.1.18 # PostgreSQL
psycopg-binary==3.1.18 # PostgreSQL
psycopg-pool==3.2.1 # PostgreSQL
psycopg>=3.2.1 # PostgreSQL
psycopg-binary>=3.2.1 # PostgreSQL
psycopg-pool>=3.2.2 # PostgreSQL
h11==0.14.0 # Testing
httpcore==1.0.5 # Testing
httpx==0.27.0 # Testing
h11>=0.14.0 # Testing
httpcore>=1.0.5 # Testing
httpx>=0.27.0 # Testing