Added JSONParser which ModelParser now extends.
authorJoshua <jroesslein@gmail.com>
Sat, 30 Jan 2010 17:08:34 +0000 (11:08 -0600)
committerJoshua <jroesslein@gmail.com>
Sat, 30 Jan 2010 17:08:34 +0000 (11:08 -0600)
This allows developers to access the raw JSON by using the JSONParser.

Example:
    api = API(parser=JSONParser())
    json = api.user_timeline('twitter')

Also fixed the Cursor objects so they should be working again.

tweepy/cursor.py
tweepy/parsers.py

index 0f762f4b1f10066bc04d84fa6c8d5afdd449fb3b..66637c401fcadb4aadd4e40d0c88cc9de73ad237 100644 (file)
@@ -56,9 +56,10 @@ class CursorIterator(BaseIterator):
     def next(self):
         if self.next_cursor == 0 or (self.limit and self.count == self.limit):
             raise StopIteration
-        data, self.next_cursor, self.prev_cursor = self.method(
+        data, cursors = self.method(
                 cursor=self.next_cursor, *self.args, **self.kargs
         )
+        self.prev_cursor, self.next_cursor = cursors
         if len(data) == 0:
             raise StopIteration
         self.count += 1
index 2f7177e81e46bca74a3918d1ba3a4620bf305140..e56cbf155aa5317684fd359ff086dcc1ec373f7e 100644 (file)
@@ -8,18 +8,40 @@ from tweepy.utils import import_simplejson
 
 class Parser(object):
 
+    def parse(self, api, payload_type, payload_list, payload):
+        """
+        Parse the response payload and return the result.
+        Returns a tuple that contains the result data and the cursors
+        (or None if not present).
+        """
+        raise NotImplementedError
+
+
+class JSONParser(Parser):
+
     payload_format = 'json'
 
+    def __init__(self):
+        self.json_lib = import_simplejson()
+
     def parse(self, api, payload_type, payload_list, payload):
-        """Parse the response payload and return the result."""
-        raise NotImplementedError
+        try:
+            json = self.json_lib.loads(payload)
+        except Exception, e:
+            raise TweepError('Failed to parse JSON payload: %s' % e)
+
+        if payload_list and isinstance(json, dict):
+            cursors = json['previous_cursor'], json['next_cursor']
+            return json, cursors
+        else:
+            return json
 
 
-class ModelParser(Parser):
+class ModelParser(JSONParser):
 
     def __init__(self, model_factory=None):
+        JSONParser.__init__(self)
         self.model_factory = model_factory or ModelFactory
-        self.json_lib = import_simplejson()
 
     def parse(self, api, payload_type, payload_list, payload):
         try:
@@ -28,13 +50,19 @@ class ModelParser(Parser):
         except AttributeError:
             raise TweepError('No model for this payload type: %s' % method.payload_type)
 
-        try:
-            json = self.json_lib.loads(payload)
-        except Exception, e:
-            raise TweepError('Failed to parse JSON: %s' % e)
+        json = JSONParser.parse(self, api, payload_type, payload_list, payload)
+        if isinstance(json, tuple):
+            json, cursors = json
+        else:
+            cursors = None
 
         if payload_list:
-            return model.parse_list(api, json)
+            result = model.parse_list(api, json)
+        else:
+            result = model.parse(api, json)
+
+        if cursors:
+            return result, cursors
         else:
-            return model.parse(api, json)
+            return result