[patch] Fix optional dependency handling for Redis and MinIO adapters #19

Merged
brian merged 4 commits from cursor/fix-optional-dependencies into main 2026-06-30 16:08:03 +02:00
Owner

Summary

Completes the optional-extras story so the base package works without redis or minio installed.

  • Fail-fast adapter importsredis_adapter.py and minio_adapter.py now raise a clear ImportError with install instructions (python-repositories[redis] / [minio]) instead of failing later with NameError.
  • Lazy package exportspython_repositories and python_repositories.adapters use PEP 562 __getattr__ so interfaces load eagerly but adapters load only when accessed.
  • Unit teststests/unit/optional_dependencies_test.py covers base import, lazy loading, and missing-extra error messages.
  • Docs — README clarifies that interfaces work with the base install; adapters require the matching extra.
  • Minor cleanupis_connected checks self._client is not None; trailing whitespace fixed in LICENSE and .gitignore.

Test plan

  • uv run pytest tests/unit/optional_dependencies_test.py -v
  • uv run pytest tests/integration/ -v
  • uv run mypy python_repositories
  • uv run pre-commit run --all-files
## Summary Completes the optional-extras story so the base package works without `redis` or `minio` installed. - **Fail-fast adapter imports** — `redis_adapter.py` and `minio_adapter.py` now raise a clear `ImportError` with install instructions (`python-repositories[redis]` / `[minio]`) instead of failing later with `NameError`. - **Lazy package exports** — `python_repositories` and `python_repositories.adapters` use PEP 562 `__getattr__` so interfaces load eagerly but adapters load only when accessed. - **Unit tests** — `tests/unit/optional_dependencies_test.py` covers base import, lazy loading, and missing-extra error messages. - **Docs** — README clarifies that interfaces work with the base install; adapters require the matching extra. - **Minor cleanup** — `is_connected` checks `self._client is not None`; trailing whitespace fixed in `LICENSE` and `.gitignore`. ## Test plan - [x] `uv run pytest tests/unit/optional_dependencies_test.py -v` - [x] `uv run pytest tests/integration/ -v` - [x] `uv run mypy python_repositories` - [x] `uv run pre-commit run --all-files`
brian added 2 commits 2026-06-30 15:51:16 +02:00
Lazy-load adapters at package boundaries and fail fast with install hints when extras are missing.

Co-authored-by: Cursor <[email protected]>
Fix trailing whitespace in LICENSE and .gitignore.
Code Quality Pipeline / code-quality (pull_request) Successful in 37s
PR Title Check / check-title (pull_request) Successful in 5s
Test Python Package / test (pull_request) Failing after 47s
f092ca2022
Co-authored-by: Cursor <[email protected]>
brian added 1 commit 2026-06-30 15:57:57 +02:00
Delegate top-level adapter imports to adapters package.
Code Quality Pipeline / code-quality (pull_request) Successful in 47s
PR Title Check / check-title (pull_request) Successful in 6s
Test Python Package / test (pull_request) Failing after 1m1s
1f02195c27
Keep lazy loading in adapters/__init__.py as the single place to register new adapters.

Co-authored-by: Cursor <[email protected]>
brian added 1 commit 2026-06-30 16:05:46 +02:00
Fix optional-deps import test for full-suite execution.
Code Quality Pipeline / code-quality (pull_request) Successful in 31s
PR Title Check / check-title (pull_request) Successful in 5s
Test Python Package / test (pull_request) Successful in 41s
f5953906c1
Run the base-import assertion in a subprocess so integration tests do not pollute sys.modules.

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

Test Coverage Report:

============================= test session starts ==============================
platform linux -- Python 3.12.3, pytest-9.1.1, pluggy-1.6.0
rootdir: /workspace/brian/python-repositories
configfile: pyproject.toml
testpaths: tests
plugins: cov-7.1.0, anyio-4.14.1
collected 73 items

tests/integration/connection_aware_interface_test.py ...                 [  4%]
tests/integration/context_aware_interface_test.py ..                     [  6%]
tests/integration/examples_test.py ...                                   [ 10%]
tests/integration/json_repository_interface_test.py ....                 [ 16%]
tests/integration/minio_adapter_test.py ............................     [ 54%]
tests/integration/object_repository_interface_test.py ....               [ 60%]
tests/integration/redis_adapter_test.py ......................           [ 90%]
tests/unit/optional_dependencies_test.py .......                         [100%]

================================ tests coverage ================================
_______________ coverage: platform linux, python 3.12.3-final-0 ________________

Name                                                            Stmts   Miss  Cover   Missing
---------------------------------------------------------------------------------------------
python_repositories/__init__.py                                    11      1    91%   39
python_repositories/adapters/__init__.py                           13      2    85%   37, 42
python_repositories/adapters/minio_adapter.py                     105      0   100%
python_repositories/adapters/redis_adapter.py                      79      0   100%
python_repositories/examples/__init__.py                            0      0   100%
python_repositories/examples/artifact_object_repository.py          9      0   100%
python_repositories/examples/user_json_repository.py               10      0   100%
python_repositories/interfaces/__init__.py                          5      0   100%
python_repositories/interfaces/connection_aware_interface.py        9      0   100%
python_repositories/interfaces/context_aware_interface.py           8      0   100%
python_repositories/interfaces/json_repository_interface.py        10      0   100%
python_repositories/interfaces/object_repository_interface.py      11      0   100%
---------------------------------------------------------------------------------------------
TOTAL                                                             270      3    99%
============================= 73 passed in 24.79s ==============================

**Test Coverage Report:** ``` ============================= test session starts ============================== platform linux -- Python 3.12.3, pytest-9.1.1, pluggy-1.6.0 rootdir: /workspace/brian/python-repositories configfile: pyproject.toml testpaths: tests plugins: cov-7.1.0, anyio-4.14.1 collected 73 items tests/integration/connection_aware_interface_test.py ... [ 4%] tests/integration/context_aware_interface_test.py .. [ 6%] tests/integration/examples_test.py ... [ 10%] tests/integration/json_repository_interface_test.py .... [ 16%] tests/integration/minio_adapter_test.py ............................ [ 54%] tests/integration/object_repository_interface_test.py .... [ 60%] tests/integration/redis_adapter_test.py ...................... [ 90%] tests/unit/optional_dependencies_test.py ....... [100%] ================================ tests coverage ================================ _______________ coverage: platform linux, python 3.12.3-final-0 ________________ Name Stmts Miss Cover Missing --------------------------------------------------------------------------------------------- python_repositories/__init__.py 11 1 91% 39 python_repositories/adapters/__init__.py 13 2 85% 37, 42 python_repositories/adapters/minio_adapter.py 105 0 100% python_repositories/adapters/redis_adapter.py 79 0 100% python_repositories/examples/__init__.py 0 0 100% python_repositories/examples/artifact_object_repository.py 9 0 100% python_repositories/examples/user_json_repository.py 10 0 100% python_repositories/interfaces/__init__.py 5 0 100% python_repositories/interfaces/connection_aware_interface.py 9 0 100% python_repositories/interfaces/context_aware_interface.py 8 0 100% python_repositories/interfaces/json_repository_interface.py 10 0 100% python_repositories/interfaces/object_repository_interface.py 11 0 100% --------------------------------------------------------------------------------------------- TOTAL 270 3 99% ============================= 73 passed in 24.79s ============================== ```
brian merged commit e9b21895f4 into main 2026-06-30 16:08:03 +02:00
brian deleted branch cursor/fix-optional-dependencies 2026-06-30 16:08:03 +02:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: lille-vemmelund/python-repositories#19