cloudevents / sdk-python

Python SDK for CloudEvents
https://pypi.org/p/cloudevents/
Apache License 2.0
266 stars 53 forks source link

CloudEvent equality is incorrect on none attributes #199

Open sasha-tkachev opened 1 year ago

sasha-tkachev commented 1 year ago

CloudEvent equality is incorrect on none attributes

from cloudevents.http import CloudEvent
CloudEvent(attributes={"type": "a", "source": "a", "a": None}) == CloudEvent({"type": "a", "source":"a"})

expected True

actual False

the spec says that null value attributes are the same as non-existing attributes

xSAVIKx commented 1 year ago

Can you please point to a specific place where this is stated in the spec? I have a pretty hard time finding this in the spec.

sasha-tkachev commented 1 year ago

It is specified only in the JSON format type system mapping I even think we MUST NOT allow None values for attributes. Because it is not a supported attribute type

xSAVIKx commented 1 year ago

Unset attributes MAY be encoded to the JSON value of null

So looks like None is a valid input.

Also, we're talking about JSON representation of the event, not about language-specific representation. IMO, it means that to_json(CloudEvent(attributes={"type": "a", "source": "a", "a": None})) must be == to to_json(CloudEvent({"type": "a", "source":"a"})). But it does not require CloudEvent instances to be equal.

xSAVIKx commented 1 year ago

Or actually:

from_json(to_json(CloudEvent(attributes={"type": "a", "source": "a", "a": None}))) must be == to from_json(to_json(CloudEvent({"type": "a", "source":"a"})))

So we must be treating JSON representation with null or without a value in the very same way. But it is not required for the instance of CloudEvent.