Added support for callbacks.
authorJosh Roesslein <jroesslein@gmail.com>
Mon, 13 Jul 2009 23:05:15 +0000 (18:05 -0500)
committerJosh Roesslein <jroesslein@gmail.com>
Mon, 13 Jul 2009 23:05:15 +0000 (18:05 -0500)
binder.py

index 80bd8d3aa0ad8ca3ead536ab4f4ed4359bf301a6..f41ef11985f04a931cf4bb054a20079332ae5e80 100644 (file)
--- a/binder.py
+++ b/binder.py
@@ -1,34 +1,19 @@
 import httplib
 import urllib
+from threading import Thread
 
 from parsers import parse_error
 from error import TweepError
 
 def bind_api(path, parser, allowed_param=None, method='GET', require_auth=False):
 
-  def _call(api, *args, **kargs):
-    # If require auth, throw exception if credentials not provided
-    if require_auth and not api._b64up:
-      raise TweepError('Authentication required!')
-
-    # Filter out unallowed parameters
-    if allowed_param:
-      parameters = dict((k,v) for k,v in kargs.items() if k in allowed_param)
-    else:
-      parameters = None
-
+  def do_request(url, parameters, api):
     # Open connection
     if api.secure:
       conn = httplib.HTTPSConnection(api.host)
     else:
       conn = httplib.HTTPConnection(api.host)
 
-    # Build url with parameters
-    if parameters:
-      url = '%s?%s' % (path, urllib.urlencode(parameters))
-    else:
-      url = path
-
     # Assemble headers
     headers = {
       'User-Agent': 'tweepy'
@@ -53,4 +38,34 @@ def bind_api(path, parser, allowed_param=None, method='GET', require_auth=False)
     conn.close()
     return out
 
-  return _call
+  def async_request(url, parameters, api, callback):
+    out = do_request(url, parameters,api)
+    callback(out)
+
+  def call(api, *args, **kargs):
+    # If require auth, throw exception if credentials not provided
+    if require_auth and not api._b64up:
+      raise TweepError('Authentication required!')
+
+    # Filter out unallowed parameters
+    if allowed_param:
+      parameters = dict((k,v) for k,v in kargs.items() if k in allowed_param)
+    else:
+      parameters = None
+
+    # Build url with parameters
+    if parameters:
+      url = '%s?%s' % (path, urllib.urlencode(parameters))
+    else:
+      url = path
+
+    # check for callback
+    callback = kargs.get('callback')
+    if callback:
+      # execute request async
+      Thread(target=async_request, args=(url, parameters, api, callback,)).start()
+    else:
+      # execute request sync
+      return do_request(url, parameters, api)
+
+  return call