Skip to content

Commit 2cd91a7

Browse files
committed
chore: provide simplified interface to read/write CE for both binary and
structured even formats Signed-off-by: Tudor Plugaru <[email protected]>
1 parent 675c44b commit 2cd91a7

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

@@ -244,3 +246,116 @@ def from_http(
244246
return from_binary(message, event_format, event_factory)
245247

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

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

0 commit comments

Comments
 (0)