feat: add BaseCRUDRepository, BaseCRUDService, BaseCRUDResource, PaginatedResponse #2

Closed
claude-bot-01 wants to merge 0 commits from feat/basecrud-baseresource into main

Summary

Migrates base CRUD classes from print-estimate-api into the repository library.

  • BaseCRUDRepository (sql/crud_repo.py): combines Create/Get/Update async SQL repos with a count(q) method. Override default_query() for soft-delete filtering.
  • BaseCRUDService (crud/service.py): generic service wrapper with list/get/create/update/delete, offset pagination, and filter support. Raises OffsetExceededError on out-of-range offsets.
  • BaseCRUDResource (crud/resource.py): FastAPI CBV that auto-registers CRUD routes via __init_subclass__. Requires the new fastapi optional extra.
  • PaginatedResponse (crud/schemas.py): generic paginated response wrapper.
  • OffsetExceededError added to exception hierarchy.
  • Version bumped to 1.8.0; fastapi and all extras updated.
  • 14 new tests in tests/test_crud.py (99 total, all passing).

Test plan

  • uv run ruff check src/ tests/ passes
  • uv run pytest passes (99/99)
  • BaseCRUDResource import is conditional — does not fail when fastapi extra is absent
## Summary Migrates base CRUD classes from `print-estimate-api` into the `repository` library. - **`BaseCRUDRepository`** (`sql/crud_repo.py`): combines Create/Get/Update async SQL repos with a `count(q)` method. Override `default_query()` for soft-delete filtering. - **`BaseCRUDService`** (`crud/service.py`): generic service wrapper with list/get/create/update/delete, offset pagination, and filter support. Raises `OffsetExceededError` on out-of-range offsets. - **`BaseCRUDResource`** (`crud/resource.py`): FastAPI CBV that auto-registers CRUD routes via `__init_subclass__`. Requires the new `fastapi` optional extra. - **`PaginatedResponse`** (`crud/schemas.py`): generic paginated response wrapper. - **`OffsetExceededError`** added to exception hierarchy. - Version bumped to `1.8.0`; `fastapi` and `all` extras updated. - 14 new tests in `tests/test_crud.py` (99 total, all passing). ## Test plan - [x] `uv run ruff check src/ tests/` passes - [x] `uv run pytest` passes (99/99) - [x] `BaseCRUDResource` import is conditional — does not fail when `fastapi` extra is absent
Migrate CRUD base classes from print-estimate-api into the repository
library so they can be shared across all services.

- `BaseCRUDRepository` (sql/crud_repo.py): combines Create/Get/Update
  async SQL repos and adds a `count(q)` method. Override
  `default_query()` for soft-delete filtering.
- `BaseCRUDService` (crud/service.py): generic service wrapping
  `BaseCRUDRepository` with list/get/create/update/delete operations,
  offset pagination, and filter support. Raises `OffsetExceededError`
  on out-of-range offsets.
- `BaseCRUDResource` (crud/resource.py): FastAPI CBV resource that
  auto-registers list/get/create/update/delete routes via
  `__init_subclass__`. Requires the new `fastapi` optional extra.
- `PaginatedResponse` (crud/schemas.py): generic paginated wrapper
  with items, total, offset, limit.
- `OffsetExceededError` added to exceptions hierarchy.
- Version bumped to 1.8.0; `fastapi` and `all` extras updated.
- Full test coverage in tests/test_crud.py (14 new tests).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
fix: make BaseCRUDResource import conditional on fastapi extra
All checks were successful
CI Pipeline - Development / Code Quality Check (pull_request) Successful in 20m59s
CI Pipeline - Development / Run Tests (pull_request) Successful in 5m22s
a9a1a1b86b
The crud/__init__.py now wraps resource imports in try/except so the
module loads cleanly without the fastapi extra installed.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
claude-bot-01 closed this pull request 2026-03-29 19:27:35 +00:00
All checks were successful
CI Pipeline - Development / Code Quality Check (pull_request) Successful in 20m59s
CI Pipeline - Development / Run Tests (pull_request) Successful in 5m22s

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
CobraPack/repository!2
No description provided.