Lightweight, efficient and developer-friendly framework for mqtt communication.
Project description
FastCC
FastCC is a Python package that simplifies
MQTT communication using decorators. With its
intuitive @route system, developers can quickly define MQTT message
handlers without boilerplate code. FastCC natively supports
Protocol Buffers :boom:, automatically handling
serialization to byte format for efficient and structured data exchange.
- Lightweight :zap:
- Efficient :rocket:
- Developer-friendly :technologist:
This project is built on top of aiomqtt which itself is built on top of paho-mqtt.
Examples
client.py
import asyncio
import contextlib
import logging
import os
import sys
import fastcc
_logger = logging.getLogger(__name__)
async def main() -> None:
"""Run the app."""
logging.basicConfig(level=logging.DEBUG)
async with fastcc.Client("localhost") as client:
try:
response = await client.request(
"greet/doe",
"Charlie",
response_type=str,
)
except fastcc.RequestError as e:
details = f"An error occurred on the server: {e}"
_logger.error(details)
response = await client.request("greet/doe", "Alice", response_type=str)
_logger.info("response: %r", response)
loop_factory: type[asyncio.AbstractEventLoop] | None = None
# See: https://github.com/empicano/aiomqtt#note-for-windows-users
if sys.platform.lower() == "win32" or os.name.lower() == "nt":
loop_factory = asyncio.SelectorEventLoop
with contextlib.suppress(KeyboardInterrupt):
asyncio.run(main(), loop_factory=loop_factory)
app.py
import asyncio
import contextlib
import logging
import os
import sys
import fastcc
router = fastcc.Router()
@router.route("greet/{family}")
async def greet(packet: str, family: str, *, database: dict[str, int]) -> str:
"""Greet a user.
Parameters
----------
packet
The name of the user.
Autofilled by fastcc.
family
The family of the user.
Autofilled by fastcc.
database
The database.
Autofilled by fastcc.
Returns
-------
str
The greeting message.
"""
# ... do some async work
await asyncio.sleep(0.1)
database[packet] += 1
occurrence = database[packet]
return (
f"Hello, {packet} from the {family} family! Saw you {occurrence} times!"
)
async def main() -> None:
"""Run the app."""
logging.basicConfig(level=logging.DEBUG)
database: dict[str, int] = {"Alice": 0, "Bob": 0}
async with fastcc.Application("localhost") as app:
app.add_router(router)
app.add_injector(database=database)
app.add_exception_handler(
KeyError,
lambda e: fastcc.RequestError(repr(e), fastcc.Status.NOT_FOUND),
)
await app.run()
loop_factory: type[asyncio.AbstractEventLoop] | None = None
# See: https://github.com/empicano/aiomqtt#note-for-windows-users
if sys.platform.lower() == "win32" or os.name.lower() == "nt":
loop_factory = asyncio.SelectorEventLoop
with contextlib.suppress(KeyboardInterrupt):
asyncio.run(main(), loop_factory=loop_factory)
stream_client.py
import asyncio
import contextlib
import logging
import os
import sys
import fastcc
_logger = logging.getLogger(__name__)
async def main() -> None:
"""Run the app."""
logging.basicConfig(level=logging.DEBUG)
async with fastcc.Client("localhost") as client:
try:
async for response in client.stream(
"greet",
"Charlie",
response_type=str,
):
_logger.info("response: %r", response)
except fastcc.RequestError as e:
details = f"An error occurred on the server: {e}"
_logger.error(details)
async for response in client.stream(
"greet",
"Alice",
response_type=str,
):
_logger.info("response: %r", response)
loop_factory: type[asyncio.AbstractEventLoop] | None = None
# See: https://github.com/empicano/aiomqtt#note-for-windows-users
if sys.platform.lower() == "win32" or os.name.lower() == "nt":
loop_factory = asyncio.SelectorEventLoop
with contextlib.suppress(KeyboardInterrupt):
asyncio.run(main(), loop_factory=loop_factory)
stream_app.py
import asyncio
import contextlib
import logging
import os
import sys
from collections.abc import AsyncIterator # noqa: TC003
import fastcc
router = fastcc.Router()
@router.route("greet")
async def greet(
packet: str,
*,
database: dict[str, int],
) -> AsyncIterator[str]:
"""Greet a user.
Parameters
----------
packet
The name of the user.
Autofilled by fastcc.
database
The database.
Autofilled by fastcc.
Yields
------
str
The greeting message.
"""
# ... do some async work
await asyncio.sleep(0.1)
for _ in range(2):
database[packet] += 1
occurrence = database[packet]
yield f"Hello, {packet}! Saw you {occurrence} times!"
async def main() -> None:
"""Run the app."""
logging.basicConfig(level=logging.DEBUG)
database: dict[str, int] = {"Alice": 0, "Bob": 0}
async with fastcc.Application("localhost") as app:
app.add_router(router)
app.add_injector(database=database)
app.add_exception_handler(
KeyError,
lambda e: fastcc.RequestError(repr(e), fastcc.Status.NOT_FOUND),
)
await app.run()
loop_factory: type[asyncio.AbstractEventLoop] | None = None
# See: https://github.com/empicano/aiomqtt#note-for-windows-users
if sys.platform.lower() == "win32" or os.name.lower() == "nt":
loop_factory = asyncio.SelectorEventLoop
with contextlib.suppress(KeyboardInterrupt):
asyncio.run(main(), loop_factory=loop_factory)
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 fastcc-5.2.2.tar.gz.
File metadata
- Download URL: fastcc-5.2.2.tar.gz
- Upload date:
- Size: 19.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
95baaa83e1e093ba837862706d7fd18e69e3532893885c9ab4bf4b834d849033
|
|
| MD5 |
b7e771d04ec2ca2e817e13e36773cef8
|
|
| BLAKE2b-256 |
fe1220cb5331080c78c24d752185168ea6e71b4848d03b42cd743e6891fb6ab6
|
File details
Details for the file fastcc-5.2.2-py3-none-any.whl.
File metadata
- Download URL: fastcc-5.2.2-py3-none-any.whl
- Upload date:
- Size: 20.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7cdc8ee51fde92b51fc75a85f4850326677e7c92f8a4d8e37e293209165416f7
|
|
| MD5 |
78ba62e59127d0152a7379ccd5bef78a
|
|
| BLAKE2b-256 |
0c782b9602e3f1cb8ad6149fa0e59f33d6ea1bead40fcc2d31678c89eac07566
|