Skip to content

Commit 026b86d

Browse files
committed
Finalize sdk interface.
1 parent 9d07e44 commit 026b86d

File tree

4 files changed

+131
-122
lines changed

4 files changed

+131
-122
lines changed

examples/demo-movielens/batch_import.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def batch_import_task(app_id, app_data, client, all_info=False):
1717
sys.stdout.write('\r[Info] %s' % count)
1818
sys.stdout.flush()
1919

20-
client.aset_user(v.uid)
20+
client.aset_user(uid=v.uid)
2121

2222
sys.stdout.write('\r[Info] %s users were imported.\n' % count)
2323
sys.stdout.flush()
@@ -34,8 +34,9 @@ def batch_import_task(app_id, app_data, client, all_info=False):
3434
sys.stdout.flush()
3535

3636
itypes = ("movie",) + v.genres
37-
client.aset_item(v.iid,
38-
{ "pio_itypes" : list(itypes),
37+
client.aset_item(iid=v.iid,
38+
properties={
39+
"pio_itypes" : list(itypes),
3940
"pio_starttime" : v.release_date.isoformat() + 'Z',
4041
"name" : v.name,
4142
"year" : v.year } )
@@ -55,16 +56,15 @@ def batch_import_task(app_id, app_data, client, all_info=False):
5556
sys.stdout.flush()
5657

5758
properties = { "pio_rating" : int(v.rating) }
58-
req = client.acreate_event({
59-
"event" : "rate",
60-
"entityType" : "pio_user",
61-
"entityId" : v.uid,
62-
"targetEntityType" : "pio_item",
63-
"targetEntityId": v.iid,
64-
"properties" : properties,
65-
"appId" : app_id,
66-
"eventTime" : v.t.replace(tzinfo=pytz.utc).isoformat(),
67-
})
59+
req = client.acreate_event(
60+
event="rate",
61+
entity_type="pio_user",
62+
entity_id=v.uid,
63+
target_entity_type="pio_item",
64+
target_entity_id=v.iid,
65+
properties=properties,
66+
event_time=v.t.replace(tzinfo=pytz.utc),
67+
)
6868

6969
sys.stdout.write('\r[Info] %s rate actions were imported.\n' % count)
7070
sys.stdout.flush()

examples/event_sample.py

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,53 +2,50 @@
22
from predictionio import NotFoundError
33
from datetime import datetime
44
import pytz
5+
import sys
56

6-
client = EventClient(app_id=6, url="http://localhost:7070")
7+
client = EventClient(app_id=4, url="http://localhost:7070")
78

89
# Check status
910
print("Check status")
1011
print(client.get_status())
1112

1213
# First event
13-
first_event_data = {
14-
"predictionKey": "my_prediction_key",
15-
"appId": 4,
16-
"event": "my_event",
17-
"entityType": "user",
18-
"entityId": "uid",
19-
"properties": {
14+
first_event_properties = {
2015
"prop1" : 1,
2116
"prop2" : "value2",
2217
"prop3" : [1, 2, 3],
2318
"prop4" : True,
2419
"prop5" : ["a", "b", "c"],
2520
"prop6" : 4.56 ,
26-
},
27-
}
28-
first_event_response = client.create_event(first_event_data)
21+
}
22+
first_event_response = client.create_event(
23+
event="my_event",
24+
entity_type="user",
25+
entity_id="uid",
26+
properties=first_event_properties)
2927
print("First Event response")
3028
print(first_event_response)
3129
print
3230

3331
# Second event
34-
second_event_data = {
35-
"appId" : 4,
36-
"predictionKey" : "my_prediction_key",
37-
"event" : "my_event",
38-
"entityType" : "user",
39-
"entityId" : "uid",
40-
"targetEntityType" : "item",
41-
"targetEntityId" : "iid",
42-
"properties" : {
32+
second_event_properties = {
4333
"someProperty" : "value1",
44-
"anotherProperty" : "value2"
45-
},
46-
"eventTime" : "2004-12-13T21:39:45.618Z",
47-
}
34+
"anotherProperty" : "value2",
35+
}
36+
second_event_response = client.create_event(
37+
event="my_event",
38+
entity_type="user",
39+
entity_id="uid",
40+
target_entity_type="item",
41+
target_entity_id="iid",
42+
properties=second_event_properties,
43+
event_time=datetime(2014, 12, 13, 21, 38, 45, 618, pytz.utc))
4844
print("Second Event response")
49-
print(client.create_event(second_event_data))
45+
print(second_event_response)
5046
print
5147

48+
5249
# Get the first event from Event Server
5350
first_event_id = first_event_response.json_body["eventId"]
5451
print("Get Event")
@@ -96,7 +93,6 @@
9693

9794
# The SDK also support specifying the eventTime. It is useful for importing
9895
# events happened in the past.
99-
#foo_time = datetime(2014, 8, 31, 4, 56, 1, 2, tzinfo=pytz.timezone('US/Pacific'))
10096
foo_time = datetime(2014, 8, 31, 4, 56, tzinfo=pytz.timezone('US/Pacific'))
10197
print("Create user at " + str(foo_time))
10298
print(client.set_user("Jarvis", {}, foo_time))

examples/import_yahoo.py

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,13 @@ def import_data(client, app_id, ticker, start_time, end_time, event_time):
104104

105105
properties = {'yahoo': yahoo_data}
106106

107-
data = {
108-
'event': '$set',
109-
'entityType': 'yahoo',
110-
'entityId': ticker,
111-
'properties': properties,
112-
'appId': app_id,
113-
'eventTime': event_time.replace(tzinfo=pytz.utc).isoformat(),
114-
}
115-
116-
response = client.create_event(data)
107+
response = client.create_event(
108+
event='$set',
109+
entity_type='yahoo',
110+
entity_id=ticker,
111+
properties=properties,
112+
event_time=event_time.replace(tzinfo=pytz.utc))
113+
117114
print(response)
118115

119116

@@ -207,5 +204,5 @@ def import_one(app_id):
207204

208205
if __name__ == '__main__':
209206
#import_all(app_id=2)
210-
#import_data_with_gaps(app_id=1)
211-
import_one(app_id=1)
207+
import_data_with_gaps(app_id=1)
208+
#import_one(app_id=1)

predictionio/__init__.py

Lines changed: 87 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,20 @@ class NotFoundError(PredictionIOAPIError):
4141
pass
4242

4343

44-
def now_if_none(t):
45-
return datetime.now(pytz.utc) if t is None else t
44+
def event_time_validation(t):
45+
""" Validate event_time according to EventAPI Specification.
46+
"""
47+
48+
if t is None:
49+
return datetime.now(pytz.utc)
50+
51+
if type(t) != datetime:
52+
raise AttributeError("event_time must be datetime.datetime")
53+
54+
if t.tzinfo is None:
55+
raise AttributeError("event_time must have tzinfo")
56+
57+
return t
4658

4759

4860
class BaseClient(object):
@@ -146,15 +158,40 @@ def __init__(self, app_id, url="http://localhost:7070",
146158
super(EventClient, self).__init__(url, threads, qsize, timeout)
147159
self.app_id = app_id
148160

149-
def acreate_event(self, data):
161+
def acreate_event(self, event, entity_type, entity_id,
162+
target_entity_type=None, target_entity_id=None, properties=None,
163+
event_time=None):
164+
data = {
165+
"appId": self.app_id,
166+
"event": event,
167+
"entityType": entity_type,
168+
"entityId": entity_id,
169+
}
170+
171+
if target_entity_type is not None:
172+
data["targetEntityType"] = target_entity_type
173+
174+
if target_entity_id is not None:
175+
data["targetEntityId"] = target_entity_id
176+
177+
if properties is not None:
178+
data["properties"] = properties
179+
180+
event_time = event_time_validation(event_time)
181+
data["eventTime"] = event_time.isoformat()
182+
150183
path = "/events.json"
151184
request = AsyncRequest("POST", path, **data)
152185
request.set_rfunc(self._acreate_resp)
153186
self._connection.make_request(request)
154187
return request
155188

156-
def create_event(self, data):
157-
return self.acreate_event(data).get_response()
189+
def create_event(self, event, entity_type, entity_id,
190+
target_entity_type=None, target_entity_id=None, properties=None,
191+
event_time=None):
192+
return self.acreate_event(event, entity_type, entity_id,
193+
target_entity_type, target_entity_id, properties,
194+
event_time).get_response()
158195

159196
def aget_event(self, event_id):
160197
enc_event_id = urllib.quote(event_id, "") # replace special char with %xx
@@ -181,107 +218,86 @@ def delete_event(self, event_id):
181218
## Below are helper functions
182219

183220
def aset_user(self, uid, properties={}, event_time=None):
184-
event_time = now_if_none(event_time)
185-
186221
"""set properties of an user"""
187-
return self.acreate_event({
188-
"event" : "$set",
189-
"entityType" : "pio_user",
190-
"entityId" : uid,
191-
"properties" : properties,
192-
"appId" : self.app_id,
193-
"eventTime": event_time.isoformat(),
194-
})
222+
return self.acreate_event(
223+
event="$set",
224+
entity_type="pio_user",
225+
entity_id=uid,
226+
properties=properties,
227+
event_time=event_time,
228+
)
195229

196230
def set_user(self, uid, properties={}, event_time=None):
197231
return self.aset_user(uid, properties, event_time).get_response()
198232

199233
def aunset_user(self, uid, properties, event_time=None):
200234
"""unset properties of an user"""
201-
event_time = now_if_none(event_time)
202-
203235
# check properties={}, it cannot be empty
204-
return self.acreate_event({
205-
"event" : "$unset",
206-
"entityType" : "pio_user",
207-
"entityId" : uid,
208-
"properties" : properties,
209-
"appId" : self.app_id,
210-
"eventTime": event_time.isoformat(),
211-
})
236+
return self.acreate_event(
237+
event="$unset",
238+
entity_type="pio_user",
239+
entity_id=uid,
240+
properties=properties,
241+
event_time=event_time,
242+
)
212243

213244
def unset_user(self, uid, properties, event_time=None):
214245
return self.aunset_user(uid, properties, event_time).get_response()
215246

216247
def adelete_user(self, uid, event_time=None):
217248
"""set properties of an user"""
218-
event_time = now_if_none(event_time)
219-
return self.acreate_event({
220-
"event" : "$delete",
221-
"entityType" : "pio_user",
222-
"entityId" : uid,
223-
"appId": self.app_id,
224-
"eventTime": event_time.isoformat(),
225-
})
249+
return self.acreate_event(
250+
event="$delete",
251+
entity_type="pio_user",
252+
entity_id=uid,
253+
event_time=event_time)
226254

227255
def delete_user(self, uid, event_time=None):
228256
return self.adelete_user(uid, event_time).get_response()
229257

230258
def aset_item(self, iid, properties={}, event_time=None):
231-
event_time = now_if_none(event_time)
232-
return self.acreate_event({
233-
"event" : "$set",
234-
"entityType" : "pio_item",
235-
"entityId" : iid,
236-
"properties" : properties,
237-
"appId" : self.app_id,
238-
"eventTime": event_time.isoformat(),
239-
})
259+
return self.acreate_event(
260+
event="$set",
261+
entity_type="pio_item",
262+
entity_id=iid,
263+
properties=properties,
264+
event_time=event_time)
240265

241266
def set_item(self, iid, properties={}, event_time=None):
242-
return self.aset_item(iid, properties).get_response()
267+
return self.aset_item(iid, properties, event_time).get_response()
243268

244269
def aunset_item(self, iid, properties={}, event_time=None):
245-
event_time = now_if_none(event_time)
246-
return self.acreate_event({
247-
"event" : "$unset",
248-
"entityType" : "pio_item",
249-
"entityId" : iid,
250-
"properties" : properties,
251-
"appId" : self.app_id,
252-
"eventTime": event_time.isoformat(),
253-
})
270+
return self.acreate_event(
271+
event="$unset",
272+
entity_type="pio_item",
273+
entity_id=iid,
274+
properties=properties,
275+
event_time=event_time)
254276

255277
def unset_item(self, iid, properties={}, event_time=None):
256278
return self.aunset_item(iid, properties, event_time).get_response()
257279

258280
def adelete_item(self, iid, event_time=None):
259281
"""set properties of an user"""
260-
event_time = now_if_none(event_time)
261-
return self.acreate_event({
262-
"event" : "$delete",
263-
"entityType" : "pio_item",
264-
"entityId" : iid,
265-
"appId": self.app_id,
266-
"eventTime": event_time.isoformat(),
267-
})
282+
return self.acreate_event(
283+
event="$delete",
284+
entity_type="pio_item",
285+
entity_id=iid,
286+
event_time=event_time)
268287

269288
def delete_item(self, iid, event_time=None):
270289
return self.adelete_item(iid, event_time).get_response()
271290

272291
def arecord_user_action_on_item(self, action, uid, iid, properties={},
273292
event_time=None):
274-
event_time = now_if_none(event_time)
275-
return self.acreate_event({
276-
"event" : action,
277-
"entityType" : "pio_user",
278-
"entityId" : uid,
279-
"targetEntityType" : "pio_item",
280-
"targetEntityId": iid,
281-
"properties" : properties,
282-
"appId" : self.app_id,
283-
"eventTime": event_time.isoformat(),
284-
})
293+
return self.acreate_event(
294+
event=action,
295+
entity_type="pio_user",
296+
entity_id=uid,
297+
target_entity_type="pio_item",
298+
target_entity_id=iid,
299+
properties=properties,
300+
event_time=event_time)
285301

286302
def record_user_action_on_item(self, action, uid, iid, properties={},
287303
event_time=None):

0 commit comments

Comments
 (0)