# HG changeset patch # User dclinton@b35c0ba3-1128-0410-9219-0b39014e361d # Date 1251816680 0 # Branch dclinton # Node ID 2bb49ee4f1fa5ce7faefb21bafa64d78f94736f7 # Parent fb8934619bc9ead75e482b93bd2713e278c69fa5 Checkpoint commit adding the ShowRelationships method and response data types diff -r fb8934619bc9ead75e482b93bd2713e278c69fa5 -r 2bb49ee4f1fa5ce7faefb21bafa64d78f94736f7 twitter.proto --- a/twitter.proto Tue Sep 01 14:46:49 2009 +0000 +++ b/twitter.proto Tue Sep 01 14:51:20 2009 +0000 @@ -167,3 +167,17 @@ // number of API calls remaining for a user optional uint64 remaining_hits = 4; } + +message Relationship { + + message User { + optional uint64 id = 1; + optional string screen_name = 2; + optional bool following = 3; + optional bool followed_by = 4; + optional bool notifications_enabled = 5; + } + + optional User source = 1; + optional User target = 2; +} diff -r fb8934619bc9ead75e482b93bd2713e278c69fa5 -r 2bb49ee4f1fa5ce7faefb21bafa64d78f94736f7 twitter.py --- a/twitter.py Tue Sep 01 14:46:49 2009 +0000 +++ b/twitter.py Tue Sep 01 14:51:20 2009 +0000 @@ -110,6 +110,41 @@ return status +def NewRelationshipFromJsonDict(data): + '''Create a new Relationship instance based on a JSON dict. + + Args: + data: A JSON dict, as parsed from a twitter API response + Returns: + A Relationship instance + ''' + relationship = twitter_pb2.Relationship() + if 'source' in data: + relationship.source.CopyFrom( + NewRelationshipUserFromJsonDict(data['source'])) + if 'target' in data: + relationship.target.CopyFrom( + NewRelationshipUserFromJsonDict(data['target'])) + return relationship + + +def NewRelationshipUserFromJsonDict(data): + '''Create a new Relationship.User instance based on a JSON dict. + + Args: + data: A JSON dict, as parsed from a twitter API response + Returns: + A Relationship.User instance + ''' + user = twitter_pb2.Relationship.User() + _CopyProperty(data, user, 'id') + _CopyProperty(data, user, 'screen_name') + _CopyProperty(data, user, 'following') + _CopyProperty(data, user, 'followed_by') + _CopyProperty(data, user, 'notifications_enabled') + return user + + def ComputeCreatedAtInSeconds(status): '''Returns the number of seconds past the epoch in the current timezone. @@ -823,6 +858,47 @@ self._CheckForTwitterError(data) return NewUserFromJsonDict(data) + def ShowFriendships(self, + source_id=None, + source_screen_name=None, + target_id=None, + target_screen_name=None): + '''Returns detailed information about the relationship between two users. + + Either source_id or source_screen_name must be supplied if the + request is not unauthenticated. + + Args: + source_id: The user_id of the subject user. [semi-optional, see above] + source_screen_name: + The screen_name of the subject user. [semi-optional, see above] + target_id: + The user_id of the target user. [one of target_id or + target_screen_name required] + target_screen_name: + The screen_name of the target user. [one of target_id or + target_screen_name required] + Returns: + A Relationship instance. + ''' + url = 'http://twitter.com/friendships/show.json' + if not self._username and not source_id and not source_screen_name: + raise TwitterError("Source must be specified if not authenticated.") + parameters = {} + if source_id: + parameters['source_id'] = source_id + if source_screen_name: + parameters['source_screen_name'] = source_screen_name + if target_id: + parameters['target_id'] = target_id + if target_screen_name: + parameters['target_screen_name'] = target_screen_name + json = self._FetchUrl(url, parameters=parameters) + data = simplejson.loads(json) + self._CheckForTwitterError(data) + return NewRelationshipFromJsonDict(data) + + def CreateFavorite(self, status): '''Favorites the status specified in the status parameter as the authenticating user. Returns the favorite status when successful. diff -r fb8934619bc9ead75e482b93bd2713e278c69fa5 -r 2bb49ee4f1fa5ce7faefb21bafa64d78f94736f7 twitter_pb2.py --- a/twitter_pb2.py Tue Sep 01 14:46:49 2009 +0000 +++ b/twitter_pb2.py Tue Sep 01 14:51:20 2009 +0000 @@ -731,6 +731,84 @@ options=None) +_RELATIONSHIP_USER = descriptor.Descriptor( + name='User', + full_name='twitter.Relationship.User', + filename='twitter.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='id', full_name='twitter.Relationship.User.id', index=0, + number=1, type=4, cpp_type=4, label=1, + default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='screen_name', full_name='twitter.Relationship.User.screen_name', index=1, + number=2, type=9, cpp_type=9, label=1, + default_value=unicode("", "utf-8"), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='following', full_name='twitter.Relationship.User.following', index=2, + number=3, type=8, cpp_type=7, label=1, + default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='followed_by', full_name='twitter.Relationship.User.followed_by', index=3, + number=4, type=8, cpp_type=7, label=1, + default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='notifications_enabled', full_name='twitter.Relationship.User.notifications_enabled', index=4, + number=5, type=8, cpp_type=7, label=1, + default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + +_RELATIONSHIP = descriptor.Descriptor( + name='Relationship', + full_name='twitter.Relationship', + filename='twitter.proto', + containing_type=None, + fields=[ + descriptor.FieldDescriptor( + name='source', full_name='twitter.Relationship.source', index=0, + number=1, type=11, cpp_type=10, label=1, + default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + descriptor.FieldDescriptor( + name='target', full_name='twitter.Relationship.target', index=1, + number=2, type=11, cpp_type=10, label=1, + default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), + ], + extensions=[ + ], + nested_types=[], # TODO(robinson): Implement. + enum_types=[ + ], + options=None) + + _USER.fields_by_name['profile'].message_type = _USER_PROFILE _USER.fields_by_name['status'].message_type = _STATUS _STATUS.fields_by_name['user'].message_type = _USER @@ -739,6 +817,8 @@ _TRENDS.fields_by_name['trends'].message_type = _TRENDS_TREND _RESULTS.fields_by_name['results'].message_type = _RESULTS_RESULT _GEOCODE.fields_by_name['unit'].enum_type = _GEOCODE_UNIT +_RELATIONSHIP.fields_by_name['source'].message_type = _RELATIONSHIP_USER +_RELATIONSHIP.fields_by_name['target'].message_type = _RELATIONSHIP_USER class User(message.Message): __metaclass__ = reflection.GeneratedProtocolMessageType @@ -780,3 +860,11 @@ __metaclass__ = reflection.GeneratedProtocolMessageType DESCRIPTOR = _RATELIMITSTATUS +class Relationship(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + + class User(message.Message): + __metaclass__ = reflection.GeneratedProtocolMessageType + DESCRIPTOR = _RELATIONSHIP_USER + DESCRIPTOR = _RELATIONSHIP +