Allow empty payloads in Redis and MinIO adapters.
PR Title Check / check-title (pull_request) Successful in 8s
Test Python Package / unit-tests (pull_request) Successful in 12s
Code Quality Pipeline / code-quality (pull_request) Successful in 20s
Test Python Package / integration-tests (pull_request) Successful in 24s
Test Python Package / coverage-report (pull_request) Successful in 11s
PR Title Check / check-title (pull_request) Successful in 8s
Test Python Package / unit-tests (pull_request) Successful in 12s
Code Quality Pipeline / code-quality (pull_request) Successful in 20s
Test Python Package / integration-tests (pull_request) Successful in 24s
Test Python Package / coverage-report (pull_request) Successful in 11s
Relax write validation so {} and zero-byte BytesIO round-trip correctly,
document None-vs-empty semantics on interfaces and adapters, and add
integration tests for placeholders and existence distinction.
Co-authored-by: Cursor <[email protected]>
This commit is contained in:
co-authored by
Cursor
parent
093e538d5b
commit
57b396bcd3
@@ -10,17 +10,27 @@ class JsonRepositoryInterface(ABC):
|
||||
|
||||
@abstractmethod
|
||||
def get(self, key: str) -> dict[str, Any] | None:
|
||||
"""Get a JSON object by key."""
|
||||
"""Get a JSON object by key.
|
||||
|
||||
Returns ``None`` when the key is absent. Returns ``{}`` when the key
|
||||
exists with an empty JSON object. Use ``value is not None`` to test
|
||||
existence; avoid truthiness checks (``{}`` is falsy).
|
||||
"""
|
||||
...
|
||||
|
||||
@abstractmethod
|
||||
def set(self, key: str, data: dict[str, Any]) -> None:
|
||||
"""Set a JSON object by key."""
|
||||
"""Set a JSON object by key.
|
||||
|
||||
Accepts any dict, including ``{}``. An empty dict creates a key that
|
||||
``get()`` returns as ``{}``, not ``None``. Use ``delete()`` to remove a
|
||||
key entirely.
|
||||
"""
|
||||
...
|
||||
|
||||
@abstractmethod
|
||||
def delete(self, key: str) -> None:
|
||||
"""Delete a JSON object by key."""
|
||||
"""Delete a JSON object by key, removing it entirely."""
|
||||
...
|
||||
|
||||
@abstractmethod
|
||||
|
||||
@@ -11,8 +11,10 @@ class ObjectRepositoryInterface(ABC):
|
||||
def get(self, object_name: str) -> BytesIO | None:
|
||||
"""Get an object by name.
|
||||
|
||||
Returns None when the object does not exist. Raises ConnectionError when
|
||||
not connected. Other backend errors propagate to the caller.
|
||||
Returns ``None`` when the object does not exist. Returns an empty
|
||||
``BytesIO`` for a zero-byte object. Use ``value is not None`` to test
|
||||
existence. Raises ConnectionError when not connected. Other backend
|
||||
errors propagate to the caller.
|
||||
"""
|
||||
...
|
||||
|
||||
@@ -23,12 +25,17 @@ class ObjectRepositoryInterface(ABC):
|
||||
data: BytesIO,
|
||||
content_type: str = "application/octet-stream",
|
||||
) -> None:
|
||||
"""Put an object by name."""
|
||||
"""Put an object by name.
|
||||
|
||||
Accepts zero-byte ``BytesIO``. A zero-byte object is returned by
|
||||
``get()`` as an empty buffer, not ``None``. Use ``delete()`` to remove
|
||||
an object entirely.
|
||||
"""
|
||||
...
|
||||
|
||||
@abstractmethod
|
||||
def delete(self, object_name: str) -> None:
|
||||
"""Delete an object by name."""
|
||||
"""Delete an object by name, removing it entirely."""
|
||||
...
|
||||
|
||||
@abstractmethod
|
||||
|
||||
Reference in New Issue
Block a user