Cloud Eventful
Broker agnostic library to associate JSON Schemas to message broker topics.
Install
Cloud Eventful is on PyPI and can be installed with:
poetry add cloudeventful
or
pip install cloudeventful
Usage
This library provides a CloudEventful class which can be used to generate
CloudEvents and associate
Pydantic models as the cloud event data field
on a per-topic basis.
Model Registration
A model is associated with a pattern describing the topics it may be published to using
the data_model decorator.
import re
from cloudeventful import CloudEventful
from pydantic import BaseModel
ce = CloudEventful(api_version="1.0.0", default_source="my/event/server")
@ce.data_model(re.compile(r"/.*/coffee"))
class Coffee(BaseModel):
flavor: str
Cloud Event Generation
Once data models are registered, CloudEvent objects can be generated with an instance of
the generated model as the CloudEvent data property.
>>> ce.event(Coffee(flavor="mocha"))
CloudEvent[ModelType](id='9b21a718-9dc1-4b56-a4ea-4e9911bc8ca6', source='my/event/server', specversion='1.0', type='Coffee', data=Coffee(flavor='mocha'), datacontenttype='application/json', dataschema='/Coffee', subject='Coffee', time=datetime.datetime(2022, 11, 19, 15, 33, 6, 39795))
Publish
A publish function can be registered with a CloudEventful instance to enforce topic
integrity at run time. This is done by setting the publish_function property on a
CloudEventful instance.
A publish function must accept at least a topic arg as a str and a data arg as a registered data model.
Then, the CloudEventful publish function can be used to wrap data models in a
CloudEvent and publish them as JSON strings. Keyword args will be passed to the
registered publish function.
Example using MQTT with Paho
import re
from cloudeventful import CloudEventful
import paho.mqtt.client as mqtt
from pydantic import BaseModel
server_id = "my/event/server"
client = mqtt.Client(server_id)
client.connect("127.0.0.1")
ce = CloudEventful(
api_version="1.0.0",
default_source=server_id,
publish_function=client.publish,
default_topic_factory=lambda m: f"/api/v1/{type(m).__name__.lower()}"
)
@ce.data_model(re.compile(r"/.*/coffee"))
class Coffee(BaseModel):
flavor: str
@ce.data_model(re.compile(r"/.*/pen"))
class Pen(BaseModel):
color: str
# Publish a data model wrapped in a cloud event.
ce.publish(Coffee(flavor="mocha"))
# Raise `ValueError` because topic does not match pattern of this model.
ce.publish(Pen(color="black"), topic="wrong-topic")
Support The Developer
Metadata
Release files for cloudeventful 3.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| cloudeventful-3.0.0.tar.gz | 7.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| cloudeventful-3.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 15.6 kB
Release files / cloudeventful-3.0.0.tar.gz
| Download URL | cloudeventful-3.0.0.tar.gz |
|---|---|
| Size | 7.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a93fbeb4e2af469b1c651b7e34e5ce380ff807c325e73d39d1220ec85d25fbf1
|
|
BLAKE2b-256 checksum How to use checksums |
2959fb843fcbae50dafe0cb1167575891944480ac455fe1844a045d1cb05cca0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.7.1 CPython/3.12.0 Linux/5.4.109+
|
Release files / cloudeventful-3.0.0-py3-none-any.whl
| Download URL | cloudeventful-3.0.0-py3-none-any.whl |
|---|---|
| Size | 7.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e5a97d7d44819e24de95027ec8534d7768a2a51644f67542acaacef7e43fd99b
|
|
BLAKE2b-256 checksum How to use checksums |
ece166671706cb912a1e9b08c1d6bf911617548587fae8dcdaa110708ac5ab4a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.7.1 CPython/3.12.0 Linux/5.4.109+
|