[breaking] Clarify MinIO get() error semantics to match Redis behavior #33

Merged
brian merged 1 commits from cursor/minio-error-semantics into main 2026-07-08 20:24:43 +02:00
Owner

Summary

  • MinioAdapter.get() now returns None only for missing objects (NoSuchKey)
  • Other S3Error and unexpected failures are re-raised instead of being logged and swallowed
  • ObjectRepositoryInterface.get() documents the contract: None means not found, ConnectionError when disconnected, other backend errors propagate

Motivation

Previously, get() returned None for both "object not found" and real failures such as permission errors or network issues. That made caller logic ambiguous and differed from Redis get(), where missing keys return None and other errors propagate.

Behavior change

Condition Before After
NoSuchKey None None (unchanged)
Other S3Error None (logged) Re-raised
Read/network errors None (logged) Re-raised
Not connected ConnectionError ConnectionError (unchanged)

This is a small breaking change for callers that treated None as a generic failure indicator.

Test plan

  • uv run pytest tests/unit/minio_adapter_test.py -v
  • uv run pytest tests/integration/minio_adapter_test.py -v -k "get or reraise"
## Summary - `MinioAdapter.get()` now returns `None` only for missing objects (`NoSuchKey`) - Other `S3Error` and unexpected failures are re-raised instead of being logged and swallowed - `ObjectRepositoryInterface.get()` documents the contract: `None` means not found, `ConnectionError` when disconnected, other backend errors propagate ## Motivation Previously, `get()` returned `None` for both "object not found" and real failures such as permission errors or network issues. That made caller logic ambiguous and differed from Redis `get()`, where missing keys return `None` and other errors propagate. ## Behavior change | Condition | Before | After | |-----------|--------|-------| | `NoSuchKey` | `None` | `None` (unchanged) | | Other `S3Error` | `None` (logged) | Re-raised | | Read/network errors | `None` (logged) | Re-raised | | Not connected | `ConnectionError` | `ConnectionError` (unchanged) | This is a small breaking change for callers that treated `None` as a generic failure indicator. ## Test plan - [x] `uv run pytest tests/unit/minio_adapter_test.py -v` - [x] `uv run pytest tests/integration/minio_adapter_test.py -v -k "get or reraise"`
brian added 1 commit 2026-07-08 20:06:25 +02:00
Clarify MinIO get() error semantics to match Redis behavior.
PR Title Check / check-title (pull_request) Successful in 6s
Test Python Package / integration-tests (pull_request) Successful in 1m17s
Test Python Package / unit-tests (pull_request) Successful in 1m28s
Code Quality Pipeline / code-quality (pull_request) Successful in 1m36s
Test Python Package / coverage-report (pull_request) Successful in 16s
5311d49fa6
Return None only for missing objects and re-raise other S3 and network failures so callers can distinguish not-found from real errors.

Co-authored-by: Cursor <cursoragent@cursor.com>
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           45      0  100.00%
python_repositories/adapters/minio_adapter.py                     121      0  100.00%
python_repositories/adapters/redis_adapter.py                      96      0  100.00%
python_repositories/config/__init__.py                              4      0  100.00%
python_repositories/config/dotenv_loader.py                         7      0  100.00%
python_repositories/config/minio_config.py                         31      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               10      0  100.00%
python_repositories/interfaces/__init__.py                          5      0  100.00%
python_repositories/interfaces/connection_aware_interface.py        8      0  100.00%
python_repositories/interfaces/context_aware_interface.py           8      0  100.00%
python_repositories/interfaces/json_repository_interface.py        10      0  100.00%
python_repositories/interfaces/object_repository_interface.py      11      0  100.00%
-----------------------------------------------------------------------------------------------
TOTAL                                                             404      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 45 0 100.00% python_repositories/adapters/minio_adapter.py 121 0 100.00% python_repositories/adapters/redis_adapter.py 96 0 100.00% python_repositories/config/__init__.py 4 0 100.00% python_repositories/config/dotenv_loader.py 7 0 100.00% python_repositories/config/minio_config.py 31 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 10 0 100.00% python_repositories/interfaces/__init__.py 5 0 100.00% python_repositories/interfaces/connection_aware_interface.py 8 0 100.00% python_repositories/interfaces/context_aware_interface.py 8 0 100.00% python_repositories/interfaces/json_repository_interface.py 10 0 100.00% python_repositories/interfaces/object_repository_interface.py 11 0 100.00% ----------------------------------------------------------------------------------------------- TOTAL 404 0 100.00% ```
brian merged commit 3bd65895ec into main 2026-07-08 20:24:43 +02:00
brian deleted branch cursor/minio-error-semantics 2026-07-08 20:24:44 +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#33