# HG changeset patch # User dclinton@b35c0ba3-1128-0410-9219-0b39014e361d # Date 1242502374 0 # Branch dclinton # Node ID 737a5a105dcf4ef16aaec0c1550757900e3dfa64 # Parent 23adb15c0a1884713794549de681d6e6403beaa1 Added the builder for the search Results object. diff -r 23adb15c0a1884713794549de681d6e6403beaa1 -r 737a5a105dcf4ef16aaec0c1550757900e3dfa64 twitter.proto --- a/twitter.proto Sat May 16 17:43:24 2009 +0000 +++ b/twitter.proto Sat May 16 19:32:54 2009 +0000 @@ -119,7 +119,8 @@ optional string refresh_url = 6; repeated Result results = 7; optional uint64 since_id = 8; - + optional sint32 results_per_page = 9; + message Result { optional string created_at = 1; optional string from_user = 2; @@ -131,8 +132,9 @@ optional string text = 8; optional string to_user = 9; optional uint64 to_user_id = 10; - optional sint32 results_per_page = 11; - // 'since_id' moved to Results, do not reuse slot 12 + // 'results_per_page' and 'since_id' moved to + // Results. Do not reuse slots 11 or 12 + // optional sint32 results_per_page = 11; // optional uint64 since_id = 12; } } diff -r 23adb15c0a1884713794549de681d6e6403beaa1 -r 737a5a105dcf4ef16aaec0c1550757900e3dfa64 twitter.py --- a/twitter.py Sat May 16 17:43:24 2009 +0000 +++ b/twitter.py Sat May 16 19:32:54 2009 +0000 @@ -204,6 +204,52 @@ return direct_message +def NewResultsFromJsonDict(data): + '''Create a new Results instance based on a JSON dict. + + Args: + data: A JSON dict, as parsed from a twitter API response + Returns: + A Results instance + ''' + results = twitter_pb2.Results() + _CopyProperty(data, results, 'completed_in') + _CopyProperty(data, results, 'max_id') + _CopyProperty(data, results, 'next_page') + _CopyProperty(data, results, 'page') + _CopyProperty(data, results, 'query') + _CopyProperty(data, results, 'refresh_url') + _CopyProperty(data, results, 'since_id') + _CopyProperty(data, results, 'results_per_page') + if 'results' in data: + for result_data in data['results']: + result = results.results.add() + result.CopyFrom(NewResultFromJsonDict(result_data)) + return results + + +def NewResultFromJsonDict(data): + '''Create a new Result instance based on a JSON dict. + + Args: + data: A JSON dict, as parsed from a twitter API response + Returns: + A Result instance + ''' + result = twitter_pb2.Results.Result() + _CopyProperty(data, result, 'created_at') + _CopyProperty(data, result, 'from_user') + _CopyProperty(data, result, 'from_user_id') + _CopyProperty(data, result, 'id') + _CopyProperty(data, result, 'iso_language_code') + _CopyProperty(data, result, 'profile_image_url') + _CopyProperty(data, result, 'source') + _CopyProperty(data, result, 'text') + _CopyProperty(data, result, 'to_user') + _CopyProperty(data, result, 'to_user_id') + return result + + class Api(object): '''A python interface into the Twitter API diff -r 23adb15c0a1884713794549de681d6e6403beaa1 -r 737a5a105dcf4ef16aaec0c1550757900e3dfa64 twitter_pb2.py --- a/twitter_pb2.py Sat May 16 17:43:24 2009 +0000 +++ b/twitter_pb2.py Sat May 16 19:32:54 2009 +0000 @@ -537,13 +537,6 @@ message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), - descriptor.FieldDescriptor( - name='results_per_page', full_name='twitter.Results.Result.results_per_page', index=10, - number=11, type=17, cpp_type=1, label=1, - default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - options=None), ], extensions=[ ], @@ -614,6 +607,13 @@ message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, options=None), + descriptor.FieldDescriptor( + name='results_per_page', full_name='twitter.Results.results_per_page', index=8, + number=9, type=17, cpp_type=1, label=1, + default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + options=None), ], extensions=[ ], diff -r 23adb15c0a1884713794549de681d6e6403beaa1 -r 737a5a105dcf4ef16aaec0c1550757900e3dfa64 twitter_test.py --- a/twitter_test.py Sat May 16 17:43:24 2009 +0000 +++ b/twitter_test.py Sat May 16 19:32:54 2009 +0000 @@ -148,6 +148,7 @@ status = twitter.NewStatusFromJsonDict(data) self.assertEqual(self._GetSampleStatus(), status) + class UserTest(unittest.TestCase): SAMPLE_JSON = '''{"description": "Indeterminate things", "id": 673483, "location": "San Francisco, CA", "name": "DeWitt", "profile_image_url": "http://twitter.com/system/user/profile_image/673483/normal/me.jpg", "screen_name": "dewitt", "status": {"created_at": "Fri Jan 26 17:28:19 +0000 2007", "id": 4212713, "text": "\\"Select all\\" and archive your Gmail inbox. The page loads so much faster!"}, "url": "http://unto.net/"}''' @@ -228,6 +229,39 @@ self.assertEqual(self._GetSampleUser(), user) +class ResultsTest(unittest.TestCase): + + SAMPLE_JSON = '''{"results":[{"text":"is loving how on twitter all these crazy popular celebraties seem like regular people like me & you....i <3 twitter","to_user_id":null,"from_user":"oxAly","id":1818791702,"from_user_id":6905503,"iso_language_code":"en","source":"<a href="http:\/\/twitter.com\/">web<\/a>","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/212410949\/mommy__me_normal.jpg","created_at":"Sat, 16 May 2009 18:59:22 +0000"},{"text":"@ryanjoy what are u using for twitter nowadays... Twitterfon just added ads and the new update is no bueno","to_user_id":1002058,"to_user":"ryanjoy","from_user":"Tyler_Batten","id":1818791671,"from_user_id":2178043,"iso_language_code":"en","source":"<a href="http:\/\/twitterfon.net\/">TwitterFon<\/a>","profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/62948019\/Photo_249_normal.jpg","created_at":"Sat, 16 May 2009 18:59:22 +0000"}],"since_id":0,"max_id":1818791702,"refresh_url":"?since_id=1818791702&q=twitter","results_per_page":2,"next_page":"?page=2&max_id=1818791702&rpp=2&q=twitter","completed_in":0.016569,"page":1,"query":"twitter"}''' + + def testNewResultsFromJsonDict(self): + data = simplejson.loads(ResultsTest.SAMPLE_JSON) + results = twitter.NewResultsFromJsonDict(data) + self.assertEqual(0.016569, results.completed_in) + self.assertEqual(1818791702, results.max_id) + self.assertEqual('?page=2&max_id=1818791702&rpp=2&q=twitter', + results.next_page) + self.assertEqual(1, results.page) + self.assertEqual('twitter', results.query) + self.assertEqual('?since_id=1818791702&q=twitter', + results.refresh_url) + self.assertEqual(2, results.results_per_page) + self.assertEqual(0, results.since_id) + self.assertEqual(2, len(results.results)) + result = results.results[0] + self.assertEqual('Sat, 16 May 2009 18:59:22 +0000', result.created_at) + self.assertEqual('oxAly', result.from_user) + self.assertEqual(6905503, result.from_user_id) + self.assertEqual(1818791702, result.id) + self.assertEqual('en', result.iso_language_code) + self.assertFalse(result.HasField('to_user_id')) + self.assertEqual('''is loving how on twitter all these crazy popular celebraties seem like regular people like me & you....i <3 twitter''', + result.text) + result = results.results[1] + self.assertEqual(1818791671, result.id) + self.assertEqual(1002058, result.to_user_id) + self.assertEqual('ryanjoy', result.to_user) + + class FileCacheTest(unittest.TestCase): def testInit(self):