[minor] Add Postgres table adapter with TableRepositoryInterface #58

Merged
brian merged 4 commits from cursor/postgres-table-adapter into main 2026-07-12 18:52:02 +02:00
Owner

Summary

  • Add TableRepositoryInterface and PostgresAdapter for dict-based row CRUD via psycopg3
  • Add PostgresConfig with env-based configuration and lazy optional [postgres] extra
  • Add unit and integration tests (testcontainers, PostgreSQL 16), plus UserTableRepository example
  • Fix integration test deadlock by using autocommit connections

Test plan

  • uv run pytest tests/unit/ -m "not integration" -v
  • uv run pytest tests/integration/postgres/ -v
  • uv run pytest -m "not integration" --cov=python_repositories --cov-report= --cov-fail-under=0 -q && uv run pytest -m integration --cov=python_repositories --cov-append --cov-report=term-missing --cov-fail-under=100 -q
  • uv run mypy python_repositories tests
## Summary - Add `TableRepositoryInterface` and `PostgresAdapter` for dict-based row CRUD via psycopg3 - Add `PostgresConfig` with env-based configuration and lazy optional `[postgres]` extra - Add unit and integration tests (testcontainers, PostgreSQL 16), plus `UserTableRepository` example - Fix integration test deadlock by using autocommit connections ## Test plan - [x] `uv run pytest tests/unit/ -m "not integration" -v` - [x] `uv run pytest tests/integration/postgres/ -v` - [x] `uv run pytest -m "not integration" --cov=python_repositories --cov-report= --cov-fail-under=0 -q && uv run pytest -m integration --cov=python_repositories --cov-append --cov-report=term-missing --cov-fail-under=100 -q` - [x] `uv run mypy python_repositories tests`
brian added 1 commit 2026-07-11 14:58:38 +02:00
Add Postgres table adapter with TableRepositoryInterface.
PR Title Check / check-title (pull_request) Successful in 7s
Code Quality Pipeline / code-quality (pull_request) Failing after 19s
Test Python Package / unit-tests (pull_request) Successful in 47s
Test Python Package / integration-tests (pull_request) Successful in 44s
Test Python Package / coverage-report (pull_request) Successful in 11s
dc6f8a3e89
Introduce PostgresAdapter for dict-based row CRUD via psycopg3, including config, lazy exports, unit/integration tests with testcontainers, and an example UserTableRepository.

Co-authored-by: Cursor <[email protected]>
Member

Test Coverage Report:

Name                                                            Stmts   Miss    Cover   Missing
-----------------------------------------------------------------------------------------------
python_repositories/__init__.py                                    12      0  100.00%
python_repositories/adapters/__init__.py                           13      0  100.00%
python_repositories/adapters/connection_aware_adapter.py           61      0  100.00%
python_repositories/adapters/minio_adapter.py                     117      0  100.00%
python_repositories/adapters/postgres_adapter.py                  146      0  100.00%
python_repositories/adapters/redis_adapter.py                     105      0  100.00%
python_repositories/config/__init__.py                              5      0  100.00%
python_repositories/config/dotenv_loader.py                         7      0  100.00%
python_repositories/config/env_bool.py                             14      0  100.00%
python_repositories/config/minio_config.py                         21      0  100.00%
python_repositories/config/postgres_config.py                      20      0  100.00%
python_repositories/config/redis_config.py                         14      0  100.00%
python_repositories/examples/__init__.py                            0      0  100.00%
python_repositories/examples/artifact_object_repository.py          9      0  100.00%
python_repositories/examples/user_json_repository.py               11      0  100.00%
python_repositories/examples/user_table_repository.py              10      0  100.00%
python_repositories/interfaces/__init__.py                          6      0  100.00%
python_repositories/interfaces/connection_aware_interface.py       10      0  100.00%
python_repositories/interfaces/context_aware_interface.py           9      0  100.00%
python_repositories/interfaces/json_repository_interface.py        16      0  100.00%
python_repositories/interfaces/object_repository_interface.py      13      0  100.00%
python_repositories/interfaces/table_repository_interface.py       14      0  100.00%
-----------------------------------------------------------------------------------------------
TOTAL                                                             633      0  100.00%

**Test Coverage Report:** ``` Name Stmts Miss Cover Missing ----------------------------------------------------------------------------------------------- python_repositories/__init__.py 12 0 100.00% python_repositories/adapters/__init__.py 13 0 100.00% python_repositories/adapters/connection_aware_adapter.py 61 0 100.00% python_repositories/adapters/minio_adapter.py 117 0 100.00% python_repositories/adapters/postgres_adapter.py 146 0 100.00% python_repositories/adapters/redis_adapter.py 105 0 100.00% python_repositories/config/__init__.py 5 0 100.00% python_repositories/config/dotenv_loader.py 7 0 100.00% python_repositories/config/env_bool.py 14 0 100.00% python_repositories/config/minio_config.py 21 0 100.00% python_repositories/config/postgres_config.py 20 0 100.00% python_repositories/config/redis_config.py 14 0 100.00% python_repositories/examples/__init__.py 0 0 100.00% python_repositories/examples/artifact_object_repository.py 9 0 100.00% python_repositories/examples/user_json_repository.py 11 0 100.00% python_repositories/examples/user_table_repository.py 10 0 100.00% python_repositories/interfaces/__init__.py 6 0 100.00% python_repositories/interfaces/connection_aware_interface.py 10 0 100.00% python_repositories/interfaces/context_aware_interface.py 9 0 100.00% python_repositories/interfaces/json_repository_interface.py 16 0 100.00% python_repositories/interfaces/object_repository_interface.py 13 0 100.00% python_repositories/interfaces/table_repository_interface.py 14 0 100.00% ----------------------------------------------------------------------------------------------- TOTAL 633 0 100.00% ```
brian added 1 commit 2026-07-11 15:00:22 +02:00
Fix ruff import ordering in postgres test files.
PR Title Check / check-title (pull_request) Successful in 8s
Test Python Package / unit-tests (pull_request) Successful in 10s
Code Quality Pipeline / code-quality (pull_request) Failing after 17s
Test Python Package / integration-tests (pull_request) Successful in 47s
Test Python Package / coverage-report (pull_request) Successful in 12s
2e38bd2406
Co-authored-by: Cursor <[email protected]>
brian added 1 commit 2026-07-11 15:01:13 +02:00
Apply prettier formatting to README and CHANGELOG.
PR Title Check / check-title (pull_request) Successful in 8s
Test Python Package / unit-tests (pull_request) Successful in 10s
Code Quality Pipeline / code-quality (pull_request) Failing after 18s
Test Python Package / integration-tests (pull_request) Successful in 56s
Test Python Package / coverage-report (pull_request) Successful in 13s
63ee17d544
Co-authored-by: Cursor <[email protected]>
Member

Test Coverage Report:

Name                                                            Stmts   Miss    Cover   Missing
-----------------------------------------------------------------------------------------------
python_repositories/__init__.py                                    12      0  100.00%
python_repositories/adapters/__init__.py                           13      0  100.00%
python_repositories/adapters/connection_aware_adapter.py           61      0  100.00%
python_repositories/adapters/minio_adapter.py                     117      0  100.00%
python_repositories/adapters/postgres_adapter.py                  146      0  100.00%
python_repositories/adapters/redis_adapter.py                     105      0  100.00%
python_repositories/config/__init__.py                              5      0  100.00%
python_repositories/config/dotenv_loader.py                         7      0  100.00%
python_repositories/config/env_bool.py                             14      0  100.00%
python_repositories/config/minio_config.py                         21      0  100.00%
python_repositories/config/postgres_config.py                      20      0  100.00%
python_repositories/config/redis_config.py                         14      0  100.00%
python_repositories/examples/__init__.py                            0      0  100.00%
python_repositories/examples/artifact_object_repository.py          9      0  100.00%
python_repositories/examples/user_json_repository.py               11      0  100.00%
python_repositories/examples/user_table_repository.py              10      0  100.00%
python_repositories/interfaces/__init__.py                          6      0  100.00%
python_repositories/interfaces/connection_aware_interface.py       10      0  100.00%
python_repositories/interfaces/context_aware_interface.py           9      0  100.00%
python_repositories/interfaces/json_repository_interface.py        16      0  100.00%
python_repositories/interfaces/object_repository_interface.py      13      0  100.00%
python_repositories/interfaces/table_repository_interface.py       14      0  100.00%
-----------------------------------------------------------------------------------------------
TOTAL                                                             633      0  100.00%

**Test Coverage Report:** ``` Name Stmts Miss Cover Missing ----------------------------------------------------------------------------------------------- python_repositories/__init__.py 12 0 100.00% python_repositories/adapters/__init__.py 13 0 100.00% python_repositories/adapters/connection_aware_adapter.py 61 0 100.00% python_repositories/adapters/minio_adapter.py 117 0 100.00% python_repositories/adapters/postgres_adapter.py 146 0 100.00% python_repositories/adapters/redis_adapter.py 105 0 100.00% python_repositories/config/__init__.py 5 0 100.00% python_repositories/config/dotenv_loader.py 7 0 100.00% python_repositories/config/env_bool.py 14 0 100.00% python_repositories/config/minio_config.py 21 0 100.00% python_repositories/config/postgres_config.py 20 0 100.00% python_repositories/config/redis_config.py 14 0 100.00% python_repositories/examples/__init__.py 0 0 100.00% python_repositories/examples/artifact_object_repository.py 9 0 100.00% python_repositories/examples/user_json_repository.py 11 0 100.00% python_repositories/examples/user_table_repository.py 10 0 100.00% python_repositories/interfaces/__init__.py 6 0 100.00% python_repositories/interfaces/connection_aware_interface.py 10 0 100.00% python_repositories/interfaces/context_aware_interface.py 9 0 100.00% python_repositories/interfaces/json_repository_interface.py 16 0 100.00% python_repositories/interfaces/object_repository_interface.py 13 0 100.00% python_repositories/interfaces/table_repository_interface.py 14 0 100.00% ----------------------------------------------------------------------------------------------- TOTAL 633 0 100.00% ```
brian added 1 commit 2026-07-11 15:02:02 +02:00
Apply ruff formatting to postgres adapter and tests.
PR Title Check / check-title (pull_request) Successful in 8s
Test Python Package / unit-tests (pull_request) Successful in 13s
Code Quality Pipeline / code-quality (pull_request) Successful in 24s
Test Python Package / integration-tests (pull_request) Successful in 29s
Test Python Package / coverage-report (pull_request) Successful in 10s
1babb52d09
Co-authored-by: Cursor <[email protected]>
Member

Test Coverage Report:

Name                                                            Stmts   Miss    Cover   Missing
-----------------------------------------------------------------------------------------------
python_repositories/__init__.py                                    12      0  100.00%
python_repositories/adapters/__init__.py                           13      0  100.00%
python_repositories/adapters/connection_aware_adapter.py           61      0  100.00%
python_repositories/adapters/minio_adapter.py                     117      0  100.00%
python_repositories/adapters/postgres_adapter.py                  146      0  100.00%
python_repositories/adapters/redis_adapter.py                     105      0  100.00%
python_repositories/config/__init__.py                              5      0  100.00%
python_repositories/config/dotenv_loader.py                         7      0  100.00%
python_repositories/config/env_bool.py                             14      0  100.00%
python_repositories/config/minio_config.py                         21      0  100.00%
python_repositories/config/postgres_config.py                      20      0  100.00%
python_repositories/config/redis_config.py                         14      0  100.00%
python_repositories/examples/__init__.py                            0      0  100.00%
python_repositories/examples/artifact_object_repository.py          9      0  100.00%
python_repositories/examples/user_json_repository.py               11      0  100.00%
python_repositories/examples/user_table_repository.py              10      0  100.00%
python_repositories/interfaces/__init__.py                          6      0  100.00%
python_repositories/interfaces/connection_aware_interface.py       10      0  100.00%
python_repositories/interfaces/context_aware_interface.py           9      0  100.00%
python_repositories/interfaces/json_repository_interface.py        16      0  100.00%
python_repositories/interfaces/object_repository_interface.py      13      0  100.00%
python_repositories/interfaces/table_repository_interface.py       14      0  100.00%
-----------------------------------------------------------------------------------------------
TOTAL                                                             633      0  100.00%

**Test Coverage Report:** ``` Name Stmts Miss Cover Missing ----------------------------------------------------------------------------------------------- python_repositories/__init__.py 12 0 100.00% python_repositories/adapters/__init__.py 13 0 100.00% python_repositories/adapters/connection_aware_adapter.py 61 0 100.00% python_repositories/adapters/minio_adapter.py 117 0 100.00% python_repositories/adapters/postgres_adapter.py 146 0 100.00% python_repositories/adapters/redis_adapter.py 105 0 100.00% python_repositories/config/__init__.py 5 0 100.00% python_repositories/config/dotenv_loader.py 7 0 100.00% python_repositories/config/env_bool.py 14 0 100.00% python_repositories/config/minio_config.py 21 0 100.00% python_repositories/config/postgres_config.py 20 0 100.00% python_repositories/config/redis_config.py 14 0 100.00% python_repositories/examples/__init__.py 0 0 100.00% python_repositories/examples/artifact_object_repository.py 9 0 100.00% python_repositories/examples/user_json_repository.py 11 0 100.00% python_repositories/examples/user_table_repository.py 10 0 100.00% python_repositories/interfaces/__init__.py 6 0 100.00% python_repositories/interfaces/connection_aware_interface.py 10 0 100.00% python_repositories/interfaces/context_aware_interface.py 9 0 100.00% python_repositories/interfaces/json_repository_interface.py 16 0 100.00% python_repositories/interfaces/object_repository_interface.py 13 0 100.00% python_repositories/interfaces/table_repository_interface.py 14 0 100.00% ----------------------------------------------------------------------------------------------- TOTAL 633 0 100.00% ```
Member

Test Coverage Report:

Name                                                            Stmts   Miss    Cover   Missing
-----------------------------------------------------------------------------------------------
python_repositories/__init__.py                                    12      0  100.00%
python_repositories/adapters/__init__.py                           13      0  100.00%
python_repositories/adapters/connection_aware_adapter.py           61      0  100.00%
python_repositories/adapters/minio_adapter.py                     117      0  100.00%
python_repositories/adapters/postgres_adapter.py                  146      0  100.00%
python_repositories/adapters/redis_adapter.py                     105      0  100.00%
python_repositories/config/__init__.py                              5      0  100.00%
python_repositories/config/dotenv_loader.py                         7      0  100.00%
python_repositories/config/env_bool.py                             14      0  100.00%
python_repositories/config/minio_config.py                         21      0  100.00%
python_repositories/config/postgres_config.py                      20      0  100.00%
python_repositories/config/redis_config.py                         14      0  100.00%
python_repositories/examples/__init__.py                            0      0  100.00%
python_repositories/examples/artifact_object_repository.py          9      0  100.00%
python_repositories/examples/user_json_repository.py               11      0  100.00%
python_repositories/examples/user_table_repository.py              10      0  100.00%
python_repositories/interfaces/__init__.py                          6      0  100.00%
python_repositories/interfaces/connection_aware_interface.py       10      0  100.00%
python_repositories/interfaces/context_aware_interface.py           9      0  100.00%
python_repositories/interfaces/json_repository_interface.py        16      0  100.00%
python_repositories/interfaces/object_repository_interface.py      13      0  100.00%
python_repositories/interfaces/table_repository_interface.py       14      0  100.00%
-----------------------------------------------------------------------------------------------
TOTAL                                                             633      0  100.00%

**Test Coverage Report:** ``` Name Stmts Miss Cover Missing ----------------------------------------------------------------------------------------------- python_repositories/__init__.py 12 0 100.00% python_repositories/adapters/__init__.py 13 0 100.00% python_repositories/adapters/connection_aware_adapter.py 61 0 100.00% python_repositories/adapters/minio_adapter.py 117 0 100.00% python_repositories/adapters/postgres_adapter.py 146 0 100.00% python_repositories/adapters/redis_adapter.py 105 0 100.00% python_repositories/config/__init__.py 5 0 100.00% python_repositories/config/dotenv_loader.py 7 0 100.00% python_repositories/config/env_bool.py 14 0 100.00% python_repositories/config/minio_config.py 21 0 100.00% python_repositories/config/postgres_config.py 20 0 100.00% python_repositories/config/redis_config.py 14 0 100.00% python_repositories/examples/__init__.py 0 0 100.00% python_repositories/examples/artifact_object_repository.py 9 0 100.00% python_repositories/examples/user_json_repository.py 11 0 100.00% python_repositories/examples/user_table_repository.py 10 0 100.00% python_repositories/interfaces/__init__.py 6 0 100.00% python_repositories/interfaces/connection_aware_interface.py 10 0 100.00% python_repositories/interfaces/context_aware_interface.py 9 0 100.00% python_repositories/interfaces/json_repository_interface.py 16 0 100.00% python_repositories/interfaces/object_repository_interface.py 13 0 100.00% python_repositories/interfaces/table_repository_interface.py 14 0 100.00% ----------------------------------------------------------------------------------------------- TOTAL 633 0 100.00% ```
brian merged commit b37b2e6e50 into main 2026-07-12 18:52:02 +02:00
brian deleted branch cursor/postgres-table-adapter 2026-07-12 18:52:02 +02:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: lille-vemmelund/python-repositories#58