From 60e23e551bd716c703edbbc5cd84900035e677e1 Mon Sep 17 00:00:00 2001 From: Ken Sato Date: Sun, 13 Feb 2011 16:49:36 -0800 Subject: [PATCH 1/5] initial commit of newly added files --- convore/client.py | 116 +++++++++++++++++++++++++++++++++++++++++++++ convore/group.py | 53 +++++++++++++++++++++ convore/live.py | 39 +++++++++++++++ convore/message.py | 22 +++++++++ convore/topic.py | 32 +++++++++++++ convore/user.py | 20 ++++++++ 6 files changed, 282 insertions(+) create mode 100644 convore/client.py create mode 100644 convore/group.py create mode 100644 convore/live.py create mode 100644 convore/message.py create mode 100644 convore/topic.py create mode 100644 convore/user.py diff --git a/convore/client.py b/convore/client.py new file mode 100644 index 0000000..a80f6d0 --- /dev/null +++ b/convore/client.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- +''' +Copyringt 2011 Kenichi Sato +''' + +import urllib2 +import json + +from group import ConvoreGroup +from topic import ConvoreTopic +from message import ConvoreMessage +from live import ConvoreLiveMessage + +URL_PREFIX = "https://convore.com/api/" +debug=0 + +class ConvoreError(Exception): + pass + +class ConvoreAuthError(ConvoreError): + pass + +class ConvoreClient(object): + + def __init__(self, username, password): + auth_handler = urllib2.HTTPBasicAuthHandler() + auth_handler.add_password(realm='Convore', + uri=URL_PREFIX, + user=username, + passwd=password) + self.openr = urllib2.build_opener(auth_handler, + urllib2.HTTPCookieProcessor(), + urllib2.HTTPSHandler(debug)) + + def _make_request(self, command, data=None, headers={}): + url = URL_PREFIX + command + try: + return self.openr.open(urllib2.Request(url = URL_PREFIX + command, + data=data, + headers=headers)) + except urllib2.HTTPError as e: + if e.code == 401: + raise ConvoreAuthError() + else: + raise + + def verify(self): + self._make_request(command="account/verify.json") + + def groups(self): + response = self._make_request(command="groups.json") + groups = [] + for g in json.load(response)['groups']: + groups.append(ConvoreGroup(g)) + return groups + + def group_by_id(self, group_id): + response = self._make_request(command="groups/%s.json" % group_id) + return ConvoreGroup(json.load(response)['group']) + + def topics(self, group): + response = self._make_request(command="groups/%s/topics.json" % group.id) + topics = [] + for t in json.load(response)['topics']: + topics.append(ConvoreTopic(t)) + return topics + + def topic_by_id(self, topic_id): + response = self._make_request(command="topics/%s.json" % topic_id) + return ConvoreTopic(json.load(response)['topic']) + + def live(self, group_id=None, cursor=None, topic_id=None): + data = {} + if group_id: + data['group_id'] = group_id + if cursor: + data['cursor'] = cursor + if topic_id: + data['topic_id'] = topic_id + response = self._make_request(command="live") + messages = [] + for m in json.load(response)['messages']: + messages.append(ConvoreLiveMessage(m)) + return messages + + + def messages(self, topic): + response = self._make_request(command="topics/%s/messages.json" % topic.id) + messages = [] + for m in json.load(response)['messages']: + print m + messages.append(ConvoreMessage(m)) + return messages + +if __name__ == '__main__': + import sys + username, password = sys.argv[1:3] + client = ConvoreClient(username, password) + #client.verify() + #for group in client.groups(): + # print group + + group = client.group_by_id(group_id=3011) + print group + for topic in client.topics(group): + print topic + + topic = client.topic_by_id(5068) + for message in client.messages(topic): + print message + + #for message in client.live(): + # print message + + + diff --git a/convore/group.py b/convore/group.py new file mode 100644 index 0000000..b286b01 --- /dev/null +++ b/convore/group.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +''' +Copyringt 2011 Kenichi Sato +''' + +from user import ConvoreUser +from datetime import datetime + +class ConvoreGroup(object): + def __init__(self, g): + self.members_count = g['members_count'] + self.name = g['name'] + self.creator = ConvoreUser(g['creator']) + self.url = g['url'] + self.slug = g['slug'] + self.date_latest_message = datetime.utcfromtimestamp(g['date_latest_message']) + self.date_created = datetime.utcfromtimestamp(g['date_created']) + self.topics_count = g['topics_count'] if 'topics_count' in g else None + self.unread = g['unread'] if 'unread' in g else None + self.id = g['id'] + + def __str__(self): + return ",".join(map(str,( + self.members_count, + self.name, + "(%s)" % self.creator, + self.url, + self.slug, + self.date_latest_message, + self.date_created, + self.topics_count, + self.unread, + self.id, + ))) + +if __name__ == "__main__": + g = {"date_latest_message": 1297661354.6135991, + "topics_count": 16, + "members_count": 643, + "name": "Python", + "creator": {"username": "fdrake", + "url": "/users/fdrake/", + "id": "886", + "img": "https://convore2.s3.amazonaws.com/userpics/886/1297277206.jpg"}, + "url": "/python/", + "date_created": 1297306311.4270909, + "unread": 0, + "id": "292", + "slug": "python" + } + + group = ConvoreGroup(g) + print group diff --git a/convore/live.py b/convore/live.py new file mode 100644 index 0000000..626076c --- /dev/null +++ b/convore/live.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +''' +Copyringt 2011 Kenichi Sato +''' + +from user import ConvoreUser +from datetime import datetime + +class ConvoreLiveMessage(object): + def __init__(self, m): + self.kind = m['kind'] + self.group_ids = m['group_ids'] + self.user = ConvoreUser(m['user']) + self._ts = datetime.utcfromtimestamp(m['_ts']) + self._id = m['_id'] + + def __str__(self): + return ",".join(map(str,( + self.kind, + self.group_ids, + "(%s)" % self.user, + self._ts, + self._id, + ))) + + +if __name__ == "__main__": + m = {"kind": "logout", + "group_ids": [292], + "user": {"username": "ksato9700", + "url": "/users/ksato9700/", + "id": 8849, + "img": "https://convore2.s3.amazonaws.com/userpics/8849/1297620465.jpg"}, + "_ts": 1297638926.453522, + "_id": "2415aa7c-37c7-11e0-a4f2-4040006c4e80" + } + + message = ConvoreLiveMessage(m) + print message diff --git a/convore/message.py b/convore/message.py new file mode 100644 index 0000000..e244e4c --- /dev/null +++ b/convore/message.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +''' +Copyringt 2011 Kenichi Sato +''' + +from user import ConvoreUser +from datetime import datetime + +class ConvoreMessage(object): + def __init__(self, m): + self.date_created = datetime.utcfromtimestamp(m['date_created']) + self.message = m['message'] + self.user = ConvoreUser(m['user']) + self.id = m['id'] + + def __str__(self): + return ",".join(map(str,( + self.date_created, + self.message, + "(%s)" % self.user, + self.id, + ))) diff --git a/convore/topic.py b/convore/topic.py new file mode 100644 index 0000000..f275452 --- /dev/null +++ b/convore/topic.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +''' +Copyringt 2011 Kenichi Sato +''' + +from user import ConvoreUser +from datetime import datetime + +class ConvoreTopic(object): + def __init__(self, t): + self.name = t['name'] + self.creator = ConvoreUser(t['creator']) + self.url = t['url'] + self.slug = t['slug'] + self.date_latest_message = datetime.utcfromtimestamp(t['date_latest_message']) + self.date_created = datetime.utcfromtimestamp(t['date_created']) + self.message_count = t['message_count'] if 'message_count' in t else None + self.unread = t['unread'] if 'unread' in t else None + self.id = t['id'] + + def __str__(self): + return ",".join(map(str,( + self.name, + "(%s)" % self.creator, + self.url, + self.slug, + self.date_latest_message, + self.date_created, + self.message_count, + self.unread, + self.id, + ))) diff --git a/convore/user.py b/convore/user.py new file mode 100644 index 0000000..aad6599 --- /dev/null +++ b/convore/user.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +""" +Copyringt 2011 Kenichi Sato +""" + +from datetime import datetime + +class ConvoreUser(object): + def __init__(self, u): + self.username = u['username'] + self.url = u['url'] + self.id = u['id'] + self.img = u['img'] + + def __str__ (self): + return ",".join(map(str,( + self.username, + self.url, + self.id, + self.img))) From 1060fd03d58542bfb5ab5aa7d128ab375f1b26a2 Mon Sep 17 00:00:00 2001 From: Ken Sato Date: Sun, 13 Feb 2011 17:29:33 -0800 Subject: [PATCH 2/5] changed __str__ to __repr__ and created simpler version of __str__ --- convore/client.py | 21 ++++++++++++++------- convore/group.py | 6 +++++- convore/live.py | 6 +++++- convore/message.py | 5 ++++- convore/topic.py | 5 ++++- convore/user.py | 15 ++++++++++++++- 6 files changed, 46 insertions(+), 12 deletions(-) diff --git a/convore/client.py b/convore/client.py index a80f6d0..7d14cac 100644 --- a/convore/client.py +++ b/convore/client.py @@ -97,20 +97,27 @@ if __name__ == '__main__': username, password = sys.argv[1:3] client = ConvoreClient(username, password) #client.verify() - #for group in client.groups(): - # print group - group = client.group_by_id(group_id=3011) - print group + for group in client.groups(): + print group + print repr(group) + + #group_id = 3011 + group_id = group.id + + group = client.group_by_id(group_id) for topic in client.topics(group): print topic + print repr(topic) - topic = client.topic_by_id(5068) + #topic_id = 5068 + topic_id = topic.id + + topic = client.topic_by_id(topic_id) for message in client.messages(topic): print message + print repr(message) #for message in client.live(): # print message - - diff --git a/convore/group.py b/convore/group.py index b286b01..c189bf8 100644 --- a/convore/group.py +++ b/convore/group.py @@ -20,10 +20,13 @@ class ConvoreGroup(object): self.id = g['id'] def __str__(self): + return "" % self.id + + def __repr__(self): return ",".join(map(str,( self.members_count, self.name, - "(%s)" % self.creator, + self.creator, self.url, self.slug, self.date_latest_message, @@ -51,3 +54,4 @@ if __name__ == "__main__": group = ConvoreGroup(g) print group + print repr(group) diff --git a/convore/live.py b/convore/live.py index 626076c..390135b 100644 --- a/convore/live.py +++ b/convore/live.py @@ -15,10 +15,13 @@ class ConvoreLiveMessage(object): self._id = m['_id'] def __str__(self): + return "" % self._id + + def __repr__(self): return ",".join(map(str,( self.kind, self.group_ids, - "(%s)" % self.user, + self.user, self._ts, self._id, ))) @@ -37,3 +40,4 @@ if __name__ == "__main__": message = ConvoreLiveMessage(m) print message + print repr(message) diff --git a/convore/message.py b/convore/message.py index e244e4c..d5e2912 100644 --- a/convore/message.py +++ b/convore/message.py @@ -14,9 +14,12 @@ class ConvoreMessage(object): self.id = m['id'] def __str__(self): + return "" % self.id + + def __repr__(self): return ",".join(map(str,( self.date_created, self.message, - "(%s)" % self.user, + self.user, self.id, ))) diff --git a/convore/topic.py b/convore/topic.py index f275452..f55c3c3 100644 --- a/convore/topic.py +++ b/convore/topic.py @@ -19,9 +19,12 @@ class ConvoreTopic(object): self.id = t['id'] def __str__(self): + return "" % self.id + + def __repr__(self): return ",".join(map(str,( self.name, - "(%s)" % self.creator, + self.creator, self.url, self.slug, self.date_latest_message, diff --git a/convore/user.py b/convore/user.py index aad6599..c5dc232 100644 --- a/convore/user.py +++ b/convore/user.py @@ -12,9 +12,22 @@ class ConvoreUser(object): self.id = u['id'] self.img = u['img'] - def __str__ (self): + def __str__(self): + return "" % self.id + + def __repr__ (self): return ",".join(map(str,( self.username, self.url, self.id, self.img))) + +if __name__ == "__main__": + u = {"username": "ksato9700", + "url": "/users/ksato9700/", + "id": 8849, + "img": "https://convore2.s3.amazonaws.com/userpics/8849/1297620465.jpg"} + + user = ConvoreUser(u) + print user + print repr(user) From a9886e7c7241a4ec362b2ab89af66fd573a59d20 Mon Sep 17 00:00:00 2001 From: Ken Sato Date: Sun, 13 Feb 2011 22:54:39 -0800 Subject: [PATCH 3/5] introduced collection classes, moved methods to them and group and topic classes --- convore/client.py | 111 ++++++++++++++++++++++----------------------- convore/group.py | 46 +++++++++++++++++-- convore/message.py | 22 +++++++++ convore/topic.py | 39 ++++++++++++++-- 4 files changed, 155 insertions(+), 63 deletions(-) diff --git a/convore/client.py b/convore/client.py index 7d14cac..b3ccf8a 100644 --- a/convore/client.py +++ b/convore/client.py @@ -3,21 +3,22 @@ Copyringt 2011 Kenichi Sato ''' +import urllib import urllib2 import json -from group import ConvoreGroup -from topic import ConvoreTopic -from message import ConvoreMessage +from group import ConvoreGroups +from topic import ConvoreTopics from live import ConvoreLiveMessage URL_PREFIX = "https://convore.com/api/" +#debug=100 debug=0 class ConvoreError(Exception): pass -class ConvoreAuthError(ConvoreError): +class ConvoreAuthError(Exception): pass class ConvoreClient(object): @@ -32,12 +33,25 @@ class ConvoreClient(object): urllib2.HTTPCookieProcessor(), urllib2.HTTPSHandler(debug)) - def _make_request(self, command, data=None, headers={}): + self.groups = ConvoreGroups(self) + self.topics = ConvoreTopics(self) + + def _make_request(self, command, params=None): url = URL_PREFIX + command + if params: + data = urllib.urlencode(params) + else: + data = None + headers = {} try: - return self.openr.open(urllib2.Request(url = URL_PREFIX + command, - data=data, - headers=headers)) + f = self.openr.open(urllib2.Request(url = URL_PREFIX + command, + data=data, + headers=headers)) + response = json.load(f) + if 'error' in response: + raise ConvoreError(response['error']) + return response + except urllib2.HTTPError as e: if e.code == 401: raise ConvoreAuthError() @@ -47,27 +61,6 @@ class ConvoreClient(object): def verify(self): self._make_request(command="account/verify.json") - def groups(self): - response = self._make_request(command="groups.json") - groups = [] - for g in json.load(response)['groups']: - groups.append(ConvoreGroup(g)) - return groups - - def group_by_id(self, group_id): - response = self._make_request(command="groups/%s.json" % group_id) - return ConvoreGroup(json.load(response)['group']) - - def topics(self, group): - response = self._make_request(command="groups/%s/topics.json" % group.id) - topics = [] - for t in json.load(response)['topics']: - topics.append(ConvoreTopic(t)) - return topics - - def topic_by_id(self, topic_id): - response = self._make_request(command="topics/%s.json" % topic_id) - return ConvoreTopic(json.load(response)['topic']) def live(self, group_id=None, cursor=None, topic_id=None): data = {} @@ -79,44 +72,50 @@ class ConvoreClient(object): data['topic_id'] = topic_id response = self._make_request(command="live") messages = [] - for m in json.load(response)['messages']: + for m in response['messages']: messages.append(ConvoreLiveMessage(m)) return messages - def messages(self, topic): - response = self._make_request(command="topics/%s/messages.json" % topic.id) - messages = [] - for m in json.load(response)['messages']: - print m - messages.append(ConvoreMessage(m)) - return messages - if __name__ == '__main__': import sys - username, password = sys.argv[1:3] + try: + username, password = sys.argv[1:3] + except: + print "usage: python %s username password" % sys.argv[0] + sys.exit(1) + client = ConvoreClient(username, password) #client.verify() - for group in client.groups(): - print group - print repr(group) - - #group_id = 3011 - group_id = group.id - - group = client.group_by_id(group_id) - for topic in client.topics(group): - print topic - print repr(topic) + groups = client.groups() + print groups - #topic_id = 5068 - topic_id = topic.id + #group = client.groups.create(name="MyTestGroup", description="desc", slug="the group") + #print repr(group) - topic = client.topic_by_id(topic_id) - for message in client.messages(topic): - print message - print repr(message) + # for group in groups: + # if "test" in group.slug: + # break + + #print group + # print repr(group) + + # topic = group.topics.create(name="Topic One") + # print repr(topic) + + # topics = group.topics() + # print topics + + # topic = client.topics[topics[-1].id] + # print topic + # print repr(topic) + + # topic.messages.create(message="Wow, I'm the first") + # topic.messages.create(message="Hmm, I must be the second") + + # messages = topic.messages() + # print messages #for message in client.live(): # print message diff --git a/convore/group.py b/convore/group.py index c189bf8..e470a74 100644 --- a/convore/group.py +++ b/convore/group.py @@ -4,10 +4,39 @@ Copyringt 2011 Kenichi Sato ''' from user import ConvoreUser +from topic import ConvoreTopics from datetime import datetime +class ConvoreGroups(object): + def __init__(self, client): + self.client = client + + def __call__(self): + response = self.client._make_request(command="groups.json") + groups = [] + for g in response['groups']: + group = ConvoreGroup(g, self.client) + groups.append(group) + return groups + + def __getitem__(self, group_id): + response = self.client._make_request(command="groups/%s.json" % group_id) + return ConvoreGroup(response['group'], self.client) + + def create(self, name, description=None, slug=None): + params = {'name': name} + if description: + params['description'] = description + if slug: + params['slug'] = slug + print params + response = self.client._make_request(command="groups/create.json", + params=params) + return ConvoreGroup(g, self.client) + + class ConvoreGroup(object): - def __init__(self, g): + def __init__(self, g, client): self.members_count = g['members_count'] self.name = g['name'] self.creator = ConvoreUser(g['creator']) @@ -19,11 +48,20 @@ class ConvoreGroup(object): self.unread = g['unread'] if 'unread' in g else None self.id = g['id'] + self.client = client + self.topics = ConvoreTopics(self.client, self.id) + + def leave(self): + params = {'group_id': self.id} + response = self.client._make_request(command="groups/%s/leave.json" % self.id, + params=params) + print response + def __str__(self): return "" % self.id def __repr__(self): - return ",".join(map(str,( + return "" if __name__ == "__main__": g = {"date_latest_message": 1297661354.6135991, @@ -52,6 +90,6 @@ if __name__ == "__main__": "slug": "python" } - group = ConvoreGroup(g) + group = ConvoreGroup(g, None) print group print repr(group) diff --git a/convore/message.py b/convore/message.py index d5e2912..8f58473 100644 --- a/convore/message.py +++ b/convore/message.py @@ -6,6 +6,28 @@ Copyringt 2011 Kenichi Sato from user import ConvoreUser from datetime import datetime +class ConvoreMessages(object): + def __init__(self, client, topic_id): + self.client = client + self.topic_id = topic_id + + def __call__(self): + response = self.client._make_request(command="topics/%s/messages.json" % self.topic_id) + messages = [] + for m in response['messages']: + message = ConvoreMessage(m) + messages.append(message) + return messages + + def create(self, message): + params = { + 'message': message, + 'topic_id': self.topic_id + } + response = self.client._make_request(command="topics/%s/messages/create.json" % self.topic_id, + params=params) + print response + class ConvoreMessage(object): def __init__(self, m): self.date_created = datetime.utcfromtimestamp(m['date_created']) diff --git a/convore/topic.py b/convore/topic.py index f55c3c3..fef28c9 100644 --- a/convore/topic.py +++ b/convore/topic.py @@ -4,10 +4,40 @@ Copyringt 2011 Kenichi Sato ''' from user import ConvoreUser +from message import ConvoreMessages from datetime import datetime +class ConvoreTopics(object): + def __init__(self, client, group_id=None): + self.client = client + self.group_id = group_id + + def __call__(self): + response = self.client._make_request(command="groups/%s/topics.json" % self.group_id) + topics = [] + for t in response['topics']: + topic = ConvoreTopic(t, self.client) + topics.append(topic) + return topics + + def __getitem__(self, topic_id): + response = self.client._make_request(command="topics/%s.json" % topic_id) + return ConvoreTopic(response['topic'], self.client) + + def create(self, name): + if self.group_id == None: + raise RuntimeError("topics should be created with group_id") + + params = { + 'name': name, + 'group_id': self.group_id + } + response = self.client._make_request(command="groups/%s/topics/create.json" % self.group_id, + params=params) + return ConvoreTopic(response['topic'], self.client) + class ConvoreTopic(object): - def __init__(self, t): + def __init__(self, t, client): self.name = t['name'] self.creator = ConvoreUser(t['creator']) self.url = t['url'] @@ -18,11 +48,14 @@ class ConvoreTopic(object): self.unread = t['unread'] if 'unread' in t else None self.id = t['id'] + self.client = client + self.messages = ConvoreMessages(self.client, self.id) + def __str__(self): return "" % self.id def __repr__(self): - return ",".join(map(str,( + return "" From de4970855f64ec02046c1d0076794e73d2456a81 Mon Sep 17 00:00:00 2001 From: Ken Sato Date: Sun, 13 Feb 2011 23:24:03 -0800 Subject: [PATCH 4/5] updated Usage --- README.rst | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/README.rst b/README.rst index 289fba3..e62d772 100644 --- a/README.rst +++ b/README.rst @@ -19,18 +19,38 @@ This is going to be awesome, and modeled after the excellent github2 module. Usage ----- -Hmm.. :: + >>> from convore.client import ConvoreClient + >>> convore = ConvoreClient('username', 'password') + + >>> groups = convore.groups() + >>> groups + [>> topics = groups[0].topics() + >>> topics + [>> len(topics) + 14 - >>> from convore import Convore - >>> convore = Convore('username', 'password') - - >>> concore.groups - [, ...] - - convore.groups[id] ? - - convore.groups.create(name, decription=None, slug=None) + >>> messages = topics[0].messages() + >>> messages + [>> new_topic = groups[0].topics.create(name="New Topic") + >>> new_topic + >> new_topic.messages.create(message="The first message") + >>> new_topic.messages.create(message="The 2nd one") + >>> len(new_topic.messages()) + 2 + + >>> convore.groups['292'] + >> convore.groups.create(name, decription=None, slug=None) + (group creation doesn't work at this moment..) From 572b8a4781064164315fa4d65ef982cf070ef17b Mon Sep 17 00:00:00 2001 From: Ken Sato Date: Sun, 13 Feb 2011 23:25:11 -0800 Subject: [PATCH 5/5] Fixed bugs in the creation methods --- convore/group.py | 2 +- convore/message.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/convore/group.py b/convore/group.py index e470a74..f45a190 100644 --- a/convore/group.py +++ b/convore/group.py @@ -32,7 +32,7 @@ class ConvoreGroups(object): print params response = self.client._make_request(command="groups/create.json", params=params) - return ConvoreGroup(g, self.client) + return ConvoreGroup(response['group'], self.client) class ConvoreGroup(object): diff --git a/convore/message.py b/convore/message.py index 8f58473..03deb19 100644 --- a/convore/message.py +++ b/convore/message.py @@ -26,7 +26,7 @@ class ConvoreMessages(object): } response = self.client._make_request(command="topics/%s/messages/create.json" % self.topic_id, params=params) - print response + return ConvoreMessage(response['message']) class ConvoreMessage(object): def __init__(self, m): @@ -39,9 +39,9 @@ class ConvoreMessage(object): return "" % self.id def __repr__(self): - return ",".join(map(str,( + return ""