Added RateLimitError. Resolves #600.
authorobskyr <powpowd@gmail.com>
Mon, 18 May 2015 18:22:50 +0000 (20:22 +0200)
committerobskyr <powpowd@gmail.com>
Mon, 18 May 2015 18:22:50 +0000 (20:22 +0200)
Can't believe this hasn't been in until now! Huh.

tweepy/__init__.py
tweepy/binder.py
tweepy/error.py

index b691e3491272a128992e8e8a7198016f5bb0ae24..1125d1c260d5f26c103e94038b9076fea52175ca 100644 (file)
@@ -10,7 +10,7 @@ __author__ = 'Joshua Roesslein'
 __license__ = 'MIT'
 
 from tweepy.models import Status, User, DirectMessage, Friendship, SavedSearch, SearchResults, ModelFactory, Category
-from tweepy.error import TweepError
+from tweepy.error import TweepError, RateLimitError
 from tweepy.api import API
 from tweepy.cache import Cache, MemoryCache, FileCache
 from tweepy.auth import OAuthHandler, AppAuthHandler
index 2ac614647d2d9bba28c187ce97a825cf6588416b..ba5557083b26c41778ba83b335f7302213e213f4 100644 (file)
@@ -12,7 +12,7 @@ import requests
 
 import logging
 
-from tweepy.error import TweepError
+from tweepy.error import TweepError, RateLimitError, is_rate_limit_error_message
 from tweepy.utils import convert_to_utf8_str
 from tweepy.models import Model
 
@@ -220,7 +220,11 @@ def bind_api(**config):
                     error_msg = self.parser.parse_error(resp.text)
                 except Exception:
                     error_msg = "Twitter error response: status code = %s" % resp.status_code
-                raise TweepError(error_msg, resp)
+
+                if is_rate_limit_error_message(error_msg):
+                    raise RateLimitError(error_msg, resp)
+                else:
+                    raise TweepError(error_msg, resp)
 
             # Parse the response payload
             result = self.parser.parse(self, resp.text)
index 1c47a5a2c3724fb74c6a56157c990c41856f9b53..7827029a55236e7becbc4e445994934c645248c5 100644 (file)
@@ -6,7 +6,6 @@ from __future__ import print_function
 
 import six
 
-
 class TweepError(Exception):
     """Tweepy exception"""
 
@@ -17,3 +16,16 @@ class TweepError(Exception):
 
     def __str__(self):
         return self.reason
+
+def is_rate_limit_error_message(message):
+    """Check if the supplied error message belongs to a rate limit error."""
+    return isinstance(message, list) \
+        and len(message) > 0 \
+        and 'code' in message[0] \
+        and message[0]['code'] == 88
+
+class RateLimitError(TweepError):
+    """Exception for Tweepy hitting the rate limit."""
+    # RateLimitError has the exact same properties and inner workings
+    # as TweepError for backwards compatibility reasons.
+    pass