Skip to content

Commit fd6f579

Browse files
authored
chore: provide simplified interface to read/write CE for both binary and structured even formats (#255)
* chore: provide simplified interface to read/write CE for both binary and structured even formats Signed-off-by: Tudor Plugaru <[email protected]> * fix typing Signed-off-by: Tudor Plugaru <[email protected]> --------- Signed-off-by: Tudor Plugaru <[email protected]>
1 parent 06834b3 commit fd6f579

File tree

4 files changed

+556
-0
lines changed

4 files changed

+556
-0
lines changed

src/cloudevents/core/bindings/http.py

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
encode_header_value,
2424
)
2525
from cloudevents.core.formats.base import Format
26+
from cloudevents.core.formats.json import JSONFormat
27+
from cloudevents.core.v1.event import CloudEvent
2628

2729
CE_PREFIX: Final[str] = "ce-"
2830

@@ -238,3 +240,116 @@ def from_http(
238240
return from_binary(message, event_format, event_factory)
239241

240242
return from_structured(message, event_format, event_factory)
243+
244+
245+
def to_binary_event(
246+
event: BaseCloudEvent,
247+
event_format: Format | None = None,
248+
) -> HTTPMessage:
249+
"""
250+
Convenience wrapper for to_binary with JSON format as default.
251+
252+
Example:
253+
>>> from cloudevents.core.v1.event import CloudEvent
254+
>>> from cloudevents.core.bindings import http
255+
>>>
256+
>>> event = CloudEvent(
257+
... attributes={"type": "com.example.test", "source": "/test"},
258+
... data={"message": "Hello"}
259+
... )
260+
>>> message = http.to_binary_event(event)
261+
262+
:param event: The CloudEvent to convert
263+
:param event_format: Format implementation (defaults to JSONFormat)
264+
:return: HTTPMessage with ce-prefixed headers
265+
"""
266+
if event_format is None:
267+
event_format = JSONFormat()
268+
return to_binary(event, event_format)
269+
270+
271+
def from_binary_event(
272+
message: HTTPMessage,
273+
event_format: Format | None = None,
274+
) -> CloudEvent:
275+
"""
276+
Convenience wrapper for from_binary with JSON format and CloudEvent as defaults.
277+
278+
Example:
279+
>>> from cloudevents.core.bindings import http
280+
>>> event = http.from_binary_event(message)
281+
282+
:param message: HTTPMessage to parse
283+
:param event_format: Format implementation (defaults to JSONFormat)
284+
:return: CloudEvent instance
285+
"""
286+
if event_format is None:
287+
event_format = JSONFormat()
288+
return from_binary(message, event_format, CloudEvent)
289+
290+
291+
def to_structured_event(
292+
event: BaseCloudEvent,
293+
event_format: Format | None = None,
294+
) -> HTTPMessage:
295+
"""
296+
Convenience wrapper for to_structured with JSON format as default.
297+
298+
Example:
299+
>>> from cloudevents.core.v1.event import CloudEvent
300+
>>> from cloudevents.core.bindings import http
301+
>>>
302+
>>> event = CloudEvent(
303+
... attributes={"type": "com.example.test", "source": "/test"},
304+
... data={"message": "Hello"}
305+
... )
306+
>>> message = http.to_structured_event(event)
307+
308+
:param event: The CloudEvent to convert
309+
:param event_format: Format implementation (defaults to JSONFormat)
310+
:return: HTTPMessage with structured content
311+
"""
312+
if event_format is None:
313+
event_format = JSONFormat()
314+
return to_structured(event, event_format)
315+
316+
317+
def from_structured_event(
318+
message: HTTPMessage,
319+
event_format: Format | None = None,
320+
) -> CloudEvent:
321+
"""
322+
Convenience wrapper for from_structured with JSON format and CloudEvent as defaults.
323+
324+
Example:
325+
>>> from cloudevents.core.bindings import http
326+
>>> event = http.from_structured_event(message)
327+
328+
:param message: HTTPMessage to parse
329+
:param event_format: Format implementation (defaults to JSONFormat)
330+
:return: CloudEvent instance
331+
"""
332+
if event_format is None:
333+
event_format = JSONFormat()
334+
return from_structured(message, event_format, CloudEvent)
335+
336+
337+
def from_http_event(
338+
message: HTTPMessage,
339+
event_format: Format | None = None,
340+
) -> CloudEvent:
341+
"""
342+
Convenience wrapper for from_http with JSON format and CloudEvent as defaults.
343+
Auto-detects binary or structured mode.
344+
345+
Example:
346+
>>> from cloudevents.core.bindings import http
347+
>>> event = http.from_http_event(message)
348+
349+
:param message: HTTPMessage to parse
350+
:param event_format: Format implementation (defaults to JSONFormat)
351+
:return: CloudEvent instance
352+
"""
353+
if event_format is None:
354+
event_format = JSONFormat()
355+
return from_http(message, event_format, CloudEvent)

src/cloudevents/core/bindings/kafka.py

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
encode_header_value,
2424
)
2525
from cloudevents.core.formats.base import Format
26+
from cloudevents.core.formats.json import JSONFormat
27+
from cloudevents.core.v1.event import CloudEvent
2628

2729
CE_PREFIX: Final[str] = "ce_"
2830
PARTITIONKEY_ATTR: Final[str] = "partitionkey"
@@ -314,3 +316,120 @@ def from_kafka(
314316
return from_binary(message, event_format, event_factory)
315317

316318
return from_structured(message, event_format, event_factory)
319+
320+
321+
def to_binary_event(
322+
event: BaseCloudEvent,
323+
event_format: Format | None = None,
324+
key_mapper: KeyMapper | None = None,
325+
) -> KafkaMessage:
326+
"""
327+
Convenience wrapper for to_binary with JSON format and CloudEvent as defaults.
328+
329+
Example:
330+
>>> from cloudevents.core.v1.event import CloudEvent
331+
>>> from cloudevents.core.bindings import kafka
332+
>>>
333+
>>> event = CloudEvent(
334+
... attributes={"type": "com.example.test", "source": "/test"},
335+
... data={"message": "Hello"}
336+
... )
337+
>>> message = kafka.to_binary_event(event)
338+
339+
:param event: The CloudEvent to convert
340+
:param event_format: Format implementation (defaults to JSONFormat)
341+
:param key_mapper: Optional function to extract message key from event
342+
:return: KafkaMessage with ce_-prefixed headers
343+
"""
344+
if event_format is None:
345+
event_format = JSONFormat()
346+
return to_binary(event, event_format, key_mapper)
347+
348+
349+
def from_binary_event(
350+
message: KafkaMessage,
351+
event_format: Format | None = None,
352+
) -> CloudEvent:
353+
"""
354+
Convenience wrapper for from_binary with JSON format and CloudEvent as defaults.
355+
356+
Example:
357+
>>> from cloudevents.core.bindings import kafka
358+
>>> event = kafka.from_binary_event(message)
359+
360+
:param message: KafkaMessage to parse
361+
:param event_format: Format implementation (defaults to JSONFormat)
362+
:return: CloudEvent instance
363+
"""
364+
if event_format is None:
365+
event_format = JSONFormat()
366+
return from_binary(message, event_format, CloudEvent)
367+
368+
369+
def to_structured_event(
370+
event: BaseCloudEvent,
371+
event_format: Format | None = None,
372+
key_mapper: KeyMapper | None = None,
373+
) -> KafkaMessage:
374+
"""
375+
Convenience wrapper for to_structured with JSON format as default.
376+
377+
Example:
378+
>>> from cloudevents.core.v1.event import CloudEvent
379+
>>> from cloudevents.core.bindings import kafka
380+
>>>
381+
>>> event = CloudEvent(
382+
... attributes={"type": "com.example.test", "source": "/test"},
383+
... data={"message": "Hello"}
384+
... )
385+
>>> message = kafka.to_structured_event(event)
386+
387+
:param event: The CloudEvent to convert
388+
:param event_format: Format implementation (defaults to JSONFormat)
389+
:param key_mapper: Optional function to extract message key from event
390+
:return: KafkaMessage with structured content
391+
"""
392+
if event_format is None:
393+
event_format = JSONFormat()
394+
return to_structured(event, event_format, key_mapper)
395+
396+
397+
def from_structured_event(
398+
message: KafkaMessage,
399+
event_format: Format | None = None,
400+
) -> CloudEvent:
401+
"""
402+
Convenience wrapper for from_structured with JSON format and CloudEvent as defaults.
403+
404+
Example:
405+
>>> from cloudevents.core.bindings import kafka
406+
>>> event = kafka.from_structured_event(message)
407+
408+
:param message: KafkaMessage to parse
409+
:param event_format: Format implementation (defaults to JSONFormat)
410+
:return: CloudEvent instance
411+
"""
412+
if event_format is None:
413+
event_format = JSONFormat()
414+
return from_structured(message, event_format, CloudEvent)
415+
416+
417+
def from_kafka_event(
418+
message: KafkaMessage,
419+
event_format: Format | None = None,
420+
) -> CloudEvent:
421+
"""
422+
Convenience wrapper for from_kafka with JSON format and CloudEvent as defaults.
423+
Auto-detects binary or structured mode.
424+
425+
Example:
426+
>>> from cloudevents.core.bindings import kafka
427+
>>> event = kafka.from_kafka_event(message)
428+
429+
:param message: KafkaMessage to parse
430+
:param event_format: Format implementation (defaults to JSONFormat)
431+
:return: CloudEvent instance
432+
"""
433+
if event_format is None:
434+
event_format = JSONFormat()
435+
return from_kafka(message, event_format, CloudEvent)

0 commit comments

Comments
 (0)