FluxMQ for Python
Project description
FluxMQ Python Library
A flexible, protocol-agnostic messaging library for Python applications, providing a unified interface for different messaging protocols.
Overview
FluxMQ is a messaging abstraction layer that allows applications to use different messaging protocols (NATS, MQTT, etc.) through a consistent interface. This makes it easy to switch between messaging systems without changing application code.
Key features:
- Protocol-agnostic messaging interface
- Support for multiple transport implementations (NATS, MQTT)
- Asynchronous and synchronous APIs
- Request-reply pattern support
- Standardized topic naming conventions
- Consistent status reporting
Installation
pip install fluxmq
Or install from source:
git clone https://github.com/yourusername/fluxmq-py.git
cd fluxmq-py
pip install -e .
Dependencies
- Python 3.7+
- For NATS support:
nats-py - For MQTT support:
paho-mqtt - For Zenoh support:
zenoh(install withpip install fluxmq[zenoh])
Quick Start
Basic Usage with NATS
import asyncio
from fluxmq.adapter.nats import Nats, NatsTopic, NatsStatus
from fluxmq.message import Message
async def main():
# Initialize transport, topic, and status
transport = Nats(servers=["nats://localhost:4222"])
topic = NatsTopic()
status = NatsStatus()
# Connect to the messaging system
await transport.connect()
# Subscribe to a topic
async def message_handler(message: Message):
print(f"Received message: {message.get_data_as_string()}")
await transport.subscribe("example.topic", message_handler)
# Publish a message
await transport.publish("example.topic", "Hello, world!")
# Request-reply pattern
response = await transport.request("example.service", {"action": "get_data"})
print(f"Response: {response.get_data_as_string()}")
# Clean up
await transport.close()
if __name__ == "__main__":
asyncio.run(main())
Using MQTT
import asyncio
from fluxmq.adapter.mqtt import MQTT, MQTTTopic, MQTTStatus
from fluxmq.message import Message
async def main():
# Initialize transport, topic, and status
transport = MQTT(host="localhost", port=1883)
topic = MQTTTopic()
status = MQTTStatus()
# Connect to the messaging system
await transport.connect()
# Subscribe to a topic
async def message_handler(message: Message):
print(f"Received message: {message.get_data_as_string()}")
await transport.subscribe("example/topic", message_handler)
# Publish a message
await transport.publish("example/topic", "Hello, world!")
# Clean up
await transport.close()
if __name__ == "__main__":
asyncio.run(main())
Using Zenoh
import asyncio
from fluxmq.adapter.zenoh import Zenoh, ZenohTopic, ZenohStatus
from fluxmq.message import Message
async def main():
# Initialize transport, topic, and status
transport = Zenoh() # Default configuration connects to local Zenoh router
topic = ZenohTopic()
status = ZenohStatus()
# Connect to the messaging system
await transport.connect()
# Subscribe to a topic
async def message_handler(message: Message):
print(f"Received message: {message.get_data_as_string()}")
await transport.subscribe("example/topic", message_handler)
# Publish a message
await transport.publish("example/topic", "Hello, world!")
# Request-reply pattern
response = await transport.request("example/service", {"action": "get_data"})
print(f"Response: {response.get_data_as_string()}")
# Clean up
await transport.close()
if __name__ == "__main__":
asyncio.run(main())
Architecture
FluxMQ consists of several key components:
Transport
The Transport interface defines the core messaging operations:
connect(): Connect to the messaging systemclose(): Close the connectionpublish(): Publish a message to a topicsubscribe(): Subscribe to a topic with a message handlerunsubscribe(): Unsubscribe from a topicrequest(): Send a request and wait for a responserespond(): Respond to a request message
Implementations:
Nats: NATS implementationMQTT: MQTT implementationZenoh: Zenoh implementation
Message
The Message class represents a message in the system:
data: The message payloadreply: Optional reply subject for request-reply patternsheaders: Optional headers associated with the message
Topic
The Topic interface provides standardized topic naming conventions:
status(): Topic for service status updatesconfiguration(): Topic for service configurationerror(): Topic for error messages- And many more...
Implementations:
StandardTopic: Base implementation with configurable prefixNatsTopic: NATS-specific implementationMQTTTopic: MQTT-specific implementationZenohTopic: Zenoh-specific implementation
Status
The Status interface provides standardized status values:
connected(): Connected statusready(): Ready statusactive(): Active statuspaused(): Paused statuserror(): Error status
Implementations:
StandardStatus: Base implementationNatsStatus: NATS-specific implementationMQTTStatus: MQTT-specific implementationZenohStatus: Zenoh-specific implementation
Advanced Usage
Synchronous API
For applications that can't use asyncio, FluxMQ provides a synchronous API:
from fluxmq.adapter.nats import SyncNats
from fluxmq.message import Message
def message_handler(message: Message):
print(f"Received message: {message.get_data_as_string()}")
# Initialize and connect
transport = SyncNats(servers=["nats://localhost:4222"])
transport.connect()
# Subscribe to a topic
transport.subscribe("example.topic", message_handler)
# Publish a message
transport.publish("example.topic", "Hello, world!")
# Clean up
transport.close()
Custom Transport Implementation
You can implement your own transport by extending the Transport interface:
from fluxmq.transport import Transport
from fluxmq.message import Message
from typing import Callable, Awaitable, Any, Union
class CustomTransport(Transport):
async def connect(self) -> None:
# Implementation...
async def close(self) -> None:
# Implementation...
async def publish(self, topic: str, payload: Union[bytes, str]) -> None:
# Implementation...
async def subscribe(self, topic: str, handler: Callable[[Message], Awaitable[None]]) -> Any:
# Implementation...
async def unsubscribe(self, topic: str) -> None:
# Implementation...
async def request(self, topic: str, payload: Union[bytes, str]) -> Message:
# Implementation...
async def respond(self, message: Message, response: Union[bytes, str]) -> None:
# Implementation...
Testing
FluxMQ includes a comprehensive test suite to ensure reliability and correctness. To run the tests:
- Install the development dependencies:
pip install -e ".[dev]"
# or
pip install -r requirements-dev.txt
- Run the tests using pytest:
pytest
For more verbose output:
pytest -v
To run only specific tests:
# Run tests for a specific module
pytest tests/test_message.py
# Run tests for a specific class
pytest tests/test_transport.py::TestTransport
# Run a specific test
pytest tests/test_message.py::test_message_init
To run tests with coverage reporting:
coverage run -m pytest
coverage report
coverage html # Generates an HTML report in htmlcov/
License
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fluxmq-0.15.0.tar.gz.
File metadata
- Download URL: fluxmq-0.15.0.tar.gz
- Upload date:
- Size: 29.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0203cddf5103cf967c4aba7c2522d29337772563e5cb721137f2c9d2ce1613d2
|
|
| MD5 |
48a8a9511ef3957d13eabd4cfeb5dd0b
|
|
| BLAKE2b-256 |
1122e02be9f6ed286be302ea4f97e8e907bcaff6c4e48dfbad56ea7ac762f03b
|
File details
Details for the file fluxmq-0.15.0-py3-none-any.whl.
File metadata
- Download URL: fluxmq-0.15.0-py3-none-any.whl
- Upload date:
- Size: 21.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
962d308499f86a6a7ee3b3af4cc386d9927fd24fd68086fd36b6f1ff982d8e27
|
|
| MD5 |
bce70b998f54cab83b0d59d57b4c3deb
|
|
| BLAKE2b-256 |
53e1c13b5ff16e86efa5aaead197af155d00059cfdd95d20f64a46b65c99fa59
|