diff --git a/python/natsrpy/__init__.py b/python/natsrpy/__init__.py index 2060832..8d41e24 100644 --- a/python/natsrpy/__init__.py +++ b/python/natsrpy/__init__.py @@ -1,4 +1,11 @@ -from . import js +from . import exceptions, js from ._natsrpy_rs import CallbackSubscription, IteratorSubscription, Message, Nats -__all__ = ["CallbackSubscription", "IteratorSubscription", "Message", "Nats", "js"] +__all__ = [ + "CallbackSubscription", + "IteratorSubscription", + "Message", + "Nats", + "exceptions", + "js", +] diff --git a/python/natsrpy/_natsrpy_rs/__init__.pyi b/python/natsrpy/_natsrpy_rs/__init__.pyi index 7539744..8634ca6 100644 --- a/python/natsrpy/_natsrpy_rs/__init__.pyi +++ b/python/natsrpy/_natsrpy_rs/__init__.pyi @@ -4,7 +4,7 @@ from typing import Any, final, overload from typing_extensions import Self -from . import js +from . import exceptions, js @final class Message: @@ -107,4 +107,11 @@ class Nats: backpressure_on_inflight: bool | None = None, ) -> js.JetStream: ... -__all__ = ["CallbackSubscription", "IteratorSubscription", "Message", "Nats", "js"] +__all__ = [ + "CallbackSubscription", + "IteratorSubscription", + "Message", + "Nats", + "exceptions", + "js", +] diff --git a/python/natsrpy/_natsrpy_rs/exceptions.pyi b/python/natsrpy/_natsrpy_rs/exceptions.pyi new file mode 100644 index 0000000..72640a5 --- /dev/null +++ b/python/natsrpy/_natsrpy_rs/exceptions.pyi @@ -0,0 +1,9 @@ +class NatsrpyBaseError(Exception): ... +class NatsrpySessionError(NatsrpyBaseError): ... +class NatsrpyPublishError(NatsrpyBaseError): ... + +__all__ = [ + "NatsrpyBaseError", + "NatsrpyPublishError", + "NatsrpySessionError", +] diff --git a/python/natsrpy/exceptions.py b/python/natsrpy/exceptions.py new file mode 100644 index 0000000..138d542 --- /dev/null +++ b/python/natsrpy/exceptions.py @@ -0,0 +1,11 @@ +from ._natsrpy_rs.exceptions import ( + NatsrpyBaseError, + NatsrpyPublishError, + NatsrpySessionError, +) + +__all__ = [ + "NatsrpyBaseError", + "NatsrpyPublishError", + "NatsrpySessionError", +] diff --git a/python/natsrpy/js.py b/python/natsrpy/js.py index ddb89b4..5df71fc 100644 --- a/python/natsrpy/js.py +++ b/python/natsrpy/js.py @@ -10,7 +10,13 @@ ReplayPolicy, ) from ._natsrpy_rs.js.kv import KeyValue, KVConfig -from ._natsrpy_rs.js.object_store import ObjectStore, ObjectStoreConfig +from ._natsrpy_rs.js.object_store import ( + ObjectInfo, + ObjectInfoIterator, + ObjectLink, + ObjectStore, + ObjectStoreConfig, +) from ._natsrpy_rs.js.stream import ( Compression, ConsumerLimits, @@ -38,6 +44,9 @@ "JetStream", "KVConfig", "KeyValue", + "ObjectInfo", + "ObjectInfoIterator", + "ObjectLink", "ObjectStore", "ObjectStoreConfig", "PersistenceMode", diff --git a/python/tests/conftest.py b/python/tests/conftest.py index 852d413..fb59d5a 100644 --- a/python/tests/conftest.py +++ b/python/tests/conftest.py @@ -27,9 +27,10 @@ async def nats(nats_url: str) -> AsyncGenerator[Nats, None]: nats = Nats(addrs=[nats_url]) await nats.startup() - yield nats - - await nats.shutdown() + try: + yield nats + finally: + await nats.shutdown() @pytest.fixture(scope="session") diff --git a/python/tests/test_object_store.py b/python/tests/test_object_store.py index efc1029..fb9cbcb 100644 --- a/python/tests/test_object_store.py +++ b/python/tests/test_object_store.py @@ -5,13 +5,11 @@ from pathlib import Path import pytest -from natsrpy._natsrpy_rs.js.object_store import ( +from natsrpy.js import ( + JetStream, ObjectInfo, ObjectInfoIterator, ObjectLink, -) -from natsrpy.js import ( - JetStream, ObjectStore, ObjectStoreConfig, StorageType, diff --git a/src/js/kv.rs b/src/js/kv.rs index b39cfd9..f5a2e80 100644 --- a/src/js/kv.rs +++ b/src/js/kv.rs @@ -181,18 +181,15 @@ impl KeyValue { ) -> NatsrpyResult> { let store = self.store.clone(); let data = bytes::Bytes::copy_from_slice(value.as_bytes()); - natsrpy_future(py, async move { - let status = store.read().await.put(key, data).await?; - Ok(status) - }) + natsrpy_future( + py, + async move { Ok(store.read().await.put(key, data).await?) }, + ) } pub fn delete<'py>(&self, py: Python<'py>, key: String) -> NatsrpyResult> { let store = self.store.clone(); - natsrpy_future(py, async move { - let kv = store.read().await; - Ok(kv.delete(key).await?) - }) + natsrpy_future(py, async move { Ok(store.read().await.delete(key).await?) }) } } diff --git a/src/lib.rs b/src/lib.rs index 5747164..7d1174d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -40,6 +40,9 @@ pub mod _natsrpy_rs { #[pymodule_export] use super::subscriptions::{callback::CallbackSubscription, iterator::IteratorSubscription}; + #[pymodule_export] + use super::exceptions::py_err::pymod as exceptions; + #[pymodule_export] use super::js::pymod as js; diff --git a/src/utils/mod.rs b/src/utils/mod.rs index 185bd89..6f4d837 100644 --- a/src/utils/mod.rs +++ b/src/utils/mod.rs @@ -3,4 +3,5 @@ pub mod headers; pub mod py; pub mod py_types; pub mod streamer; + pub use futures::natsrpy_future;