Skip to content

Commit 132fe61

Browse files
committed
Getter/Setters with some tests
Signed-off-by: Denis Makogon <lildee1991@gmail.com>
1 parent 5cfb987 commit 132fe61

File tree

5 files changed

+278
-24
lines changed

5 files changed

+278
-24
lines changed

cloudevents/sdk/event/base.py

Lines changed: 68 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,80 @@
1717
import typing
1818

1919

20-
class BaseEvent(object):
20+
class EventGetterSetter(object):
2121

22-
def Properties(self) -> dict:
22+
def CloudEventVersion(self) -> str:
23+
raise Exception("not implemented")
24+
25+
# CloudEvent attribute getters
26+
def EventType(self) -> str:
27+
raise Exception("not implemented")
28+
29+
def Source(self) -> str:
30+
raise Exception("not implemented")
31+
32+
def EventID(self) -> str:
33+
raise Exception("not implemented")
34+
35+
def EventTime(self) -> str:
36+
raise Exception("not implemented")
37+
38+
def SchemaURL(self) -> str:
39+
raise Exception("not implemented")
40+
41+
def Data(self) -> object:
42+
raise Exception("not implemented")
43+
44+
def Extensions(self) -> dict:
45+
raise Exception("not implemented")
46+
47+
def ContentType(self) -> str:
48+
raise Exception("not implemented")
49+
50+
# CloudEvent attribute constructors
51+
# Each setter return an instance of its class
52+
# in order to build a pipeline of setter
53+
def WithEventType(self, eventType: str) -> object:
54+
raise Exception("not implemented")
55+
56+
def WithSource(self, source: str) -> object:
57+
raise Exception("not implemented")
58+
59+
def WithEventID(self, eventID: str) -> object:
60+
raise Exception("not implemented")
61+
62+
def WithEventTime(self, eventTime: str) -> object:
63+
raise Exception("not implemented")
64+
65+
def WithSchemaURL(self, schemaURL: str) -> object:
66+
raise Exception("not implemented")
67+
68+
def WithData(self, data: object) -> object:
69+
raise Exception("not implemented")
70+
71+
def WithExtensions(self, extensions: dict) -> object:
72+
raise Exception("not implemented")
73+
74+
def WithContentType(self, contentType: str) -> object:
75+
raise Exception("not implemented")
76+
77+
78+
class BaseEvent(EventGetterSetter):
79+
80+
def Properties(self, with_nullable=False) -> dict:
2381
props = dict()
2482
for name, value in self.__dict__.items():
2583
if str(name).startswith("ce__"):
26-
props.update(
27-
{
28-
str(name).replace("ce__", ""): value.get()
29-
}
30-
)
84+
v = value.get()
85+
if v is not None or with_nullable:
86+
props.update(
87+
{
88+
str(name).replace("ce__", ""): value.get()
89+
}
90+
)
3191

3292
return props
3393

34-
def Extensions(self) -> dict:
35-
props = self.Properties()
36-
return props.get("extensions")
37-
3894
def Get(self, key: str) -> (object, bool):
3995
formatted_key = "ce__{0}".format(key.lower())
4096
ok = hasattr(self, formatted_key)
@@ -67,7 +123,7 @@ def UnmarshalJSON(self, b: typing.IO):
67123
self.Set(name, value)
68124

69125
def UnmarshalBinary(self, headers: dict, body: typing.IO):
70-
props = self.Properties()
126+
props = self.Properties(with_nullable=True)
71127
exts = props.get("extensions")
72128
for key in props:
73129
formatted_key = "ce-{0}".format(key)

cloudevents/sdk/event/upstream.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,59 @@ def __init__(self):
3131

3232
def CloudEventVersion(self) -> str:
3333
return self.ce__specversion.get()
34+
35+
def EventType(self) -> str:
36+
return self.ce__type.get()
37+
38+
def Source(self) -> str:
39+
return self.ce__source.get()
40+
41+
def EventID(self) -> str:
42+
return self.ce__id.get()
43+
44+
def EventTime(self) -> str:
45+
return self.ce__time.get()
46+
47+
def SchemaURL(self) -> str:
48+
return self.ce__schemaurl.get()
49+
50+
def Data(self) -> object:
51+
return self.ce__data.get()
52+
53+
def Extensions(self) -> dict:
54+
return self.ce__extensions.get()
55+
56+
def ContentType(self) -> str:
57+
return self.ce__contenttype.get()
58+
59+
def WithEventType(self, eventType: str) -> base.BaseEvent:
60+
self.Set("type", eventType)
61+
return self
62+
63+
def WithSource(self, source: str) -> base.BaseEvent:
64+
self.Set("source", source)
65+
return self
66+
67+
def WithEventID(self, eventID: str) -> base.BaseEvent:
68+
self.Set("id", eventID)
69+
return self
70+
71+
def WithEventTime(self, eventTime: str) -> base.BaseEvent:
72+
self.Set("time", eventTime)
73+
return self
74+
75+
def WithSchemaURL(self, schemaURL: str) -> base.BaseEvent:
76+
self.Set("schemaurl", schemaURL)
77+
return self
78+
79+
def WithData(self, data: object) -> base.BaseEvent:
80+
self.Set("data", data)
81+
return self
82+
83+
def WithExtensions(self, extensions: dict) -> base.BaseEvent:
84+
self.Set("extension", extensions)
85+
return self
86+
87+
def WithContentType(self, contentType: str) -> base.BaseEvent:
88+
self.Set("contenttype", contentType)
89+
return self

cloudevents/sdk/event/v01.py

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,75 @@ def __init__(self):
2626
"eventTypeVersion", None, False)
2727
self.ce__source = opt.Option("source", None, True)
2828
self.ce__eventID = opt.Option("eventID", None, True)
29-
self.ce__evenTime = opt.Option("eventTime", None, True)
29+
self.ce__eventTime = opt.Option("eventTime", None, True)
3030
self.ce__schemaURL = opt.Option("schemaURL", None, False)
3131
self.ce__contentType = opt.Option("contentType", None, False)
3232
self.ce__data = opt.Option("data", None, False)
3333
self.ce__extensions = opt.Option("extensions", dict(), False)
3434

3535
def CloudEventVersion(self) -> str:
3636
return self.ce__cloudEventsVersion.get()
37+
38+
def EventType(self) -> str:
39+
return self.ce__eventType.get()
40+
41+
def Source(self) -> str:
42+
return self.ce__source.get()
43+
44+
def EventID(self) -> str:
45+
return self.ce__eventID.get()
46+
47+
def EventTime(self) -> str:
48+
return self.ce__eventTime.get()
49+
50+
def SchemaURL(self) -> str:
51+
return self.ce__schemaURL.get()
52+
53+
def Data(self) -> object:
54+
return self.ce__data.get()
55+
56+
def Extensions(self) -> dict:
57+
return self.ce__extensions.get()
58+
59+
def ContentType(self) -> str:
60+
return self.ce__contentType.get()
61+
62+
def WithEventType(self, eventType: str) -> base.BaseEvent:
63+
self.Set("eventType", eventType)
64+
return self
65+
66+
def WithSource(self, source: str) -> base.BaseEvent:
67+
self.Set("source", source)
68+
return self
69+
70+
def WithEventID(self, eventID: str) -> base.BaseEvent:
71+
self.Set("eventID", eventID)
72+
return self
73+
74+
def WithEventTime(self, eventTime: str) -> base.BaseEvent:
75+
self.Set("eventTime", eventTime)
76+
return self
77+
78+
def WithSchemaURL(self, schemaURL: str) -> base.BaseEvent:
79+
self.Set("schemaURL", schemaURL)
80+
return self
81+
82+
def WithData(self, data: object) -> base.BaseEvent:
83+
self.Set("data", data)
84+
return self
85+
86+
def WithExtensions(self, extensions: dict) -> base.BaseEvent:
87+
self.Set("extension", extensions)
88+
return self
89+
90+
def WithContentType(self, contentType: str) -> base.BaseEvent:
91+
self.Set("contentType", contentType)
92+
return self
93+
94+
# additional getter/setter
95+
def EventTypeVersion(self) -> str:
96+
return self.ce__eventTypeVersion.get()
97+
98+
def WithEventTypeVersion(self, eventTypeVersion: str) -> base.BaseEvent:
99+
self.Set("eventTypeVersion", eventTypeVersion)
100+
return self

cloudevents/tests/data.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,26 @@
1212
# License for the specific language governing permissions and limitations
1313
# under the License.
1414

15-
15+
contentType = "application/json"
1616
ce_type = "word.found.exclamation"
1717
ce_id = "16fb5f0b-211e-1102-3dfe-ea6e2806f124"
18+
source = "pytest"
19+
specversion = "0.1"
20+
eventTime = "2018-10-23T12:28:23.3464579Z"
21+
body = '{"name":"john"}'
1822
headers = {
19-
"ce-specversion": "0.1",
23+
"ce-specversion": specversion,
2024
"ce-type": ce_type,
2125
"ce-id": ce_id,
22-
"ce-time": "2018-10-23T12:28:23.3464579Z",
23-
"ce-source": "pytest",
24-
"Content-Type": "application/json"
26+
"ce-time": eventTime,
27+
"ce-source": source,
28+
"Content-Type": contentType
2529
}
2630
ce = {
27-
"specversion": "0.1",
28-
"type": "word.found.exclamation",
29-
"id": "16fb5f0b-211e-1102-3dfe-ea6e2806f124",
30-
"time": "2018-10-23T12:28:23.3464579Z",
31-
"source": "pytest",
32-
"contenttype": "application/json"
31+
"specversion": specversion,
32+
"type": ce_type,
33+
"id": ce_id,
34+
"time": eventTime,
35+
"source": source,
36+
"contenttype": contentType
3337
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# All Rights Reserved.
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
4+
# not use this file except in compliance with the License. You may obtain
5+
# a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12+
# License for the specific language governing permissions and limitations
13+
# under the License.
14+
15+
import ujson
16+
17+
from cloudevents.sdk.event import v01
18+
from cloudevents.sdk.event import upstream
19+
20+
from cloudevents.sdk import converters
21+
from cloudevents.sdk import marshaller
22+
from cloudevents.sdk.converters import structured
23+
24+
from cloudevents.tests import data
25+
26+
27+
def test_event_pipeline_upstream():
28+
event = (
29+
upstream.Event().
30+
WithContentType(data.contentType).
31+
WithData(data.body).
32+
WithEventID(data.ce_id).
33+
WithSource(data.source).
34+
WithEventTime(data.eventTime).
35+
WithEventType(data.ce_type)
36+
)
37+
m = marshaller.NewDefaultHTTPMarshaller(type(event))
38+
new_headers, body = m.ToRequest(event, converters.TypeBinary, lambda x: x)
39+
assert new_headers is not None
40+
assert "ce-specversion" in new_headers
41+
assert "ce-type" in new_headers
42+
assert "ce-source" in new_headers
43+
assert "ce-id" in new_headers
44+
assert "ce-time" in new_headers
45+
assert "ce-contenttype" in new_headers
46+
assert data.body == body
47+
48+
49+
def test_event_pipeline_v01():
50+
event = (
51+
v01.Event().
52+
WithContentType(data.contentType).
53+
WithData(data.body).
54+
WithEventID(data.ce_id).
55+
WithSource(data.source).
56+
WithEventTime(data.eventTime).
57+
WithEventType(data.ce_type)
58+
)
59+
m = marshaller.NewHTTPMarshaller(
60+
[
61+
structured.NewJSONHTTPCloudEventConverter(type(event))
62+
]
63+
)
64+
65+
_, body = m.ToRequest(event, converters.TypeStructured, lambda x: x)
66+
new_headers = ujson.load(body)
67+
assert new_headers is not None
68+
assert "cloudEventsVersion" in new_headers
69+
assert "eventType" in new_headers
70+
assert "source" in new_headers
71+
assert "eventID" in new_headers
72+
assert "eventTime" in new_headers
73+
assert "contentType" in new_headers
74+
assert data.body == new_headers["data"]

0 commit comments

Comments
 (0)