diff options
| author | Devendra | 2014-04-23 14:03:13 +0530 | 
|---|---|---|
| committer | Devendra | 2014-04-23 14:03:13 +0530 | 
| commit | 09cd0c015ae276aa849297a6a976065b2b3f247b (patch) | |
| tree | f1b253aa856e3a16e36eea9213857a33f6c35df4 | |
| parent | fdb46e56fa6794940f9fbe51a2863d58e927e655 (diff) | |
| download | pubnub-python-09cd0c015ae276aa849297a6a976065b2b3f247b.tar.bz2 | |
modifying code for pep 8 compliance
36 files changed, 2042 insertions, 1923 deletions
| diff --git a/common/PubnubBase.py b/common/PubnubBase.py index 14ae6c4..5863da9 100644 --- a/common/PubnubBase.py +++ b/common/PubnubBase.py @@ -1,32 +1,37 @@ -try: import json -except ImportError: import simplejson as json +try: +    import json +except ImportError: +    import simplejson as json  import time  import hashlib  import uuid  import sys -try: from urllib.parse  import quote -except: from urllib2 import quote +try: +    from urllib.parse import quote +except: +    from urllib2 import quote -from base64  import urlsafe_b64encode +from base64 import urlsafe_b64encode  from hashlib import sha256  import hmac +  class PubnubBase(object):      def __init__(          self,          publish_key,          subscribe_key, -        secret_key = False, -        cipher_key = False, -        auth_key = None, -        ssl_on = False, -        origin = 'pubsub.pubnub.com', -        UUID = None -    ) : +        secret_key=False, +        cipher_key=False, +        auth_key=None, +        ssl_on=False, +        origin='pubsub.pubnub.com', +        UUID=None +    ):          """          #**          #* Pubnub @@ -38,41 +43,41 @@ class PubnubBase(object):          #* @param string secret_key optional key to sign messages.          #* @param boolean ssl required for 2048 bit encrypted messages.          #* @param string origin PUBNUB Server Origin. -        #* @param string pres_uuid optional identifier for presence (auto-generated if not supplied) +        #* @param string pres_uuid optional identifier +        #*    for presence (auto-generated if not supplied)          #**          ## Initiat Class          pubnub = Pubnub( 'PUBLISH-KEY', 'SUBSCRIBE-KEY', 'SECRET-KEY', False )          """ -        self.origin        = origin -        self.limit         = 1800 -        self.publish_key   = publish_key +        self.origin = origin +        self.limit = 1800 +        self.publish_key = publish_key          self.subscribe_key = subscribe_key -        self.secret_key    = secret_key -        self.cipher_key    = cipher_key -        self.ssl           = ssl_on -        self.auth_key      = auth_key - +        self.secret_key = secret_key +        self.cipher_key = cipher_key +        self.ssl = ssl_on +        self.auth_key = auth_key -        if self.ssl : +        if self.ssl:              self.origin = 'https://' + self.origin -        else : -            self.origin = 'http://'  + self.origin -         +        else: +            self.origin = 'http://' + self.origin +          self.uuid = UUID or str(uuid.uuid4())          if type(sys.version_info) is tuple: -            self.python_version  = 2 -            self.pc              = PubnubCrypto2() +            self.python_version = 2 +            self.pc = PubnubCrypto2()          else:              if sys.version_info.major == 2: -                self.python_version  = 2 -                self.pc              = PubnubCrypto2() +                self.python_version = 2 +                self.pc = PubnubCrypto2()              else:                  self.python_version = 3 -                self.pc             = PubnubCrypto3() -         +                self.pc = PubnubCrypto3() +          if not isinstance(self.uuid, str):              raise AttributeError("pres_uuid must be a string") @@ -93,7 +98,7 @@ class PubnubBase(object):          return signature      ''' -    def _pam_sign( self, msg ): +    def _pam_sign(self, msg):          """Calculate a signature by secret key and message."""          return urlsafe_b64encode(hmac.new( @@ -102,7 +107,7 @@ class PubnubBase(object):              sha256          ).digest()) -    def _pam_auth( self, query , apicode=0, callback=None): +    def _pam_auth(self, query, apicode=0, callback=None):          """Issue an authenticated request."""          if 'timestamp' not in query: @@ -129,57 +134,50 @@ class PubnubBase(object):          query['signature'] = self._pam_sign(sign_input) -        ''' -        url = ("https://pubsub.pubnub.com/v1/auth/{apitype}/sub-key/".format(apitype="audit" if (apicode) else "grant") + -            self.subscribe_key + "?" + -            params + "&signature=" + -            quote(signature, safe="")) -        ''' -          return self._request({"urlcomponents": [ -            'v1', 'auth', "audit" if (apicode) else "grant" ,  +            'v1', 'auth', "audit" if (apicode) else "grant",              'sub-key',              self.subscribe_key -        ], 'urlparams' : query},  -        self._return_wrapped_callback(callback)) +        ], 'urlparams': query}, +            self._return_wrapped_callback(callback)) -    def grant( self, channel, authkey=False, read=True, write=True, ttl=5, callback=None): +    def grant(self, channel, authkey=False, read=True, +              write=True, ttl=5, callback=None):          """Grant Access on a Channel."""          return self._pam_auth({ -            "channel" : channel, -            "auth"    : authkey, -            "r"       : read  and 1 or 0, -            "w"       : write and 1 or 0, -            "ttl"     : ttl +            "channel": channel, +            "auth": authkey, +            "r": read and 1 or 0, +            "w": write and 1 or 0, +            "ttl": ttl          }, callback=callback) -    def revoke( self, channel, authkey=False, ttl=1, callback=None): +    def revoke(self, channel, authkey=False, ttl=1, callback=None):          """Revoke Access on a Channel."""          return self._pam_auth({ -            "channel" : channel, -            "auth"    : authkey, -            "r"       : 0, -            "w"       : 0, -            "ttl"     : ttl +            "channel": channel, +            "auth": authkey, +            "r": 0, +            "w": 0, +            "ttl": ttl          }, callback=callback)      def audit(self, channel=False, authkey=False, callback=None):          return self._pam_auth({ -            "channel" : channel, -            "auth"    : authkey -        },1, callback=callback) -             - +            "channel": channel, +            "auth": authkey +        }, 1, callback=callback)      def encrypt(self, message):          if self.cipher_key: -            message = json.dumps(self.pc.encrypt(self.cipher_key, json.dumps(message)).replace('\n','')) -        else : +            message = json.dumps(self.pc.encrypt( +                self.cipher_key, json.dumps(message)).replace('\n', '')) +        else:              message = json.dumps(message) -        return message; +        return message      def decrypt(self, message):          if self.cipher_key: @@ -190,15 +188,17 @@ class PubnubBase(object):      def _return_wrapped_callback(self, callback=None):          def _new_format_callback(response):              if 'payload' in response: -                if (callback != None): callback({'message' : response['message'], 'payload' : response['payload']}) +                if (callback is not None): +                    callback({'message': response['message'], +                              'payload': response['payload']})              else: -                if (callback != None):callback(response) -        if (callback != None): +                if (callback is not None): +                    callback(response) +        if (callback is not None):              return _new_format_callback          else:              return None -      def publish(channel, message, callback=None, error=None):          """          #** @@ -232,10 +232,11 @@ class PubnubBase(object):              channel,              '0',              message -        ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback),  -        error=self._return_wrapped_callback(error)) -     -    def presence( self, channel, callback, error=None) : +        ], 'urlparams': {'auth': self.auth_key}}, +            callback=self._return_wrapped_callback(callback), +            error=self._return_wrapped_callback(error)) + +    def presence(self, channel, callback, error=None):          """          #**          #* presence @@ -254,13 +255,15 @@ class PubnubBase(object):          pubnub.presence({              'channel'  : 'hello_world', -            'callback' : receive  +            'callback' : receive          })          """ -        return self.subscribe({'channel': channel+'-pnpres', 'subscribe_key':self.subscribe_key, 'callback': self._return_wrapped_callback(callback)}) -     -     -    def here_now( self, channel, callback, error=None) : +        return self.subscribe({ +            'channel': channel + '-pnpres', +            'subscribe_key': self.subscribe_key, +            'callback': self._return_wrapped_callback(callback)}) + +    def here_now(self, channel, callback, error=None):          """          #**          #* Here Now @@ -281,33 +284,31 @@ class PubnubBase(object):          """          channel = str(args['channel']) - -        callback    = args['callback']  if 'callback'  in args else None -        error       = args['error']     if 'error'     in args else None +        callback = args['callback'] if 'callback' in args else None +        error = args['error'] if 'error' in args else None          ## Fail if bad input. -        if not channel : +        if not channel:              raise Exception('Missing Channel')              return False -         +          ## Get Presence Here Now          return self._request({"urlcomponents": [ -            'v2','presence', +            'v2', 'presence',              'sub_key', self.subscribe_key,              'channel', channel -        ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback),  -        error=self._return_wrapped_callback(error)) +        ], 'urlparams': {'auth': self.auth_key}}, +            callback=self._return_wrapped_callback(callback), +            error=self._return_wrapped_callback(error)) -    def history(self, channel, count=100, reverse=False, start=None, end=None, callback=None, error=None) : +    def history(self, channel, count=100, reverse=False, +                start=None, end=None, callback=None, error=None):          """          #**          #* History          #*          #* Load history from a channel.          #* -        #* @param array args with 'channel', optional: 'start', 'end', 'reverse', 'count' -        #* @return mixed false on fail, array on success. -        #*          ## History Example          history = pubnub.detailedHistory({ @@ -318,25 +319,26 @@ class PubnubBase(object):          """ -        params = dict()  +        params = dict() -        params['count']     = count -        params['reverse']   = reverse -        params['start']     = start -        params['end']       = end +        params['count'] = count +        params['reverse'] = reverse +        params['start'] = start +        params['end'] = end          ## Get History -        return self._request({ 'urlcomponents' : [ +        return self._request({'urlcomponents': [              'v2',              'history',              'sub-key',              self.subscribe_key,              'channel',              channel, -        ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback),  -        error=self._return_wrapped_callback(error)) +        ], 'urlparams': {'auth': self.auth_key}}, +            callback=self._return_wrapped_callback(callback), +            error=self._return_wrapped_callback(error)) -    def time(self,callback=None) : +    def time(self, callback=None):          """          #**          #* Time @@ -352,28 +354,28 @@ class PubnubBase(object):          """ -        time = self._request({'urlcomponents' : [ +        time = self._request({'urlcomponents': [              'time',              '0'          ]}, callback) -        if time != None: +        if time is not None:              return time[0] - -    def _encode( self, request ) : +    def _encode(self, request):          return [ -            "".join([ ' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and -                hex(ord(ch)).replace( '0x', '%' ).upper() or -                ch for ch in list(bit) -            ]) for bit in request] -     -    def getUrl(self,request): +            "".join([' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and +                     hex(ord(ch)).replace('0x', '%').upper() or +                     ch for ch in list(bit) +                     ]) for bit in request] + +    def getUrl(self, request):          ## Build URL          url = self.origin + '/' + "/".join([ -            "".join([ ' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and -                hex(ord(ch)).replace( '0x', '%' ).upper() or -                ch for ch in list(bit) -            ]) for bit in request["urlcomponents"]]) +            "".join([' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and +                     hex(ord(ch)).replace('0x', '%').upper() or +                     ch for ch in list(bit) +                     ]) for bit in request["urlcomponents"]])          if ("urlparams" in request): -            url = url + '?' + "&".join([ x + "=" + str(y)  for x,y in request["urlparams"].items() if y is not None]) +            url = url + '?' + "&".join([x + "=" + str(y) for x, y in request[ +                "urlparams"].items() if y is not None])          return url diff --git a/common/PubnubCore.py b/common/PubnubCore.py index 7fb67d6..1c00215 100644 --- a/common/PubnubCore.py +++ b/common/PubnubCore.py @@ -3,13 +3,13 @@ class PubnubCore(PubnubCoreAsync):          self,          publish_key,          subscribe_key, -        secret_key = False, -        cipher_key = False, -        auth_key = None, -        ssl_on = False, -        origin = 'pubsub.pubnub.com', -        uuid = None -    ) : +        secret_key=False, +        cipher_key=False, +        auth_key=None, +        ssl_on=False, +        origin='pubsub.pubnub.com', +        uuid=None +    ):          """          #**          #* Pubnub @@ -21,7 +21,8 @@ class PubnubCore(PubnubCoreAsync):          #* @param string secret_key optional key to sign messages.          #* @param boolean ssl required for 2048 bit encrypted messages.          #* @param string origin PUBNUB Server Origin. -        #* @param string pres_uuid optional identifier for presence (auto-generated if not supplied) +        #* @param string pres_uuid optional +        #*  identifier for presence (auto-generated if not supplied)          #**          ## Initiat Class @@ -37,16 +38,14 @@ class PubnubCore(PubnubCoreAsync):              ssl_on=ssl_on,              origin=origin,              UUID=uuid -        )         +        )          self.subscriptions = {} -        self.timetoken     = 0 -        self.version       = '3.4' +        self.timetoken = 0 +        self.version = '3.4'          self.accept_encoding = 'gzip' - - -    def subscribe_sync( self, args ) : +    def subscribe_sync(self, args):          """          #**          #* Subscribe @@ -65,50 +64,50 @@ class PubnubCore(PubnubCoreAsync):          pubnub.subscribe({              'channel'  : 'hello_world', -            'callback' : receive  +            'callback' : receive          })          """          ## Fail if missing channel -        if not 'channel' in args : +        if not 'channel' in args:              raise Exception('Missing Channel.')              return False          ## Fail if missing callback -        if not 'callback' in args : +        if not 'callback' in args:              raise Exception('Missing Callback.')              return False          ## Capture User Input -        channel   = str(args['channel']) -        callback  = args['callback'] +        channel = str(args['channel']) +        callback = args['callback']          subscribe_key = args.get('subscribe_key') or self.subscribe_key          ## Begin Subscribe -        while True : +        while True:              timetoken = 'timetoken' in args and args['timetoken'] or 0 -            try : +            try:                  ## Wait for Message -                response = self._request({"urlcomponents" : [ +                response = self._request({"urlcomponents": [                      'subscribe',                      subscribe_key,                      channel,                      '0',                      str(timetoken) -                ],"urlparams" : {"uuid" : self.uuid }}) +                ], "urlparams": {"uuid": self.uuid}}) -                messages          = response[0] +                messages = response[0]                  args['timetoken'] = response[1]                  ## If it was a timeout -                if not len(messages) : +                if not len(messages):                      continue                  ## Run user Callback and Reconnect if user permits. -                for message in messages : -                    if not callback(self.decrypt(message)) : +                for message in messages: +                    if not callback(self.decrypt(message)):                          return              except Exception: diff --git a/common/PubnubCoreAsync.py b/common/PubnubCoreAsync.py index deb6038..de7627f 100644 --- a/common/PubnubCoreAsync.py +++ b/common/PubnubCoreAsync.py @@ -6,32 +6,38 @@ except ImportError:      sha256 = digestmod.new  import hmac +  class EmptyLock():      def __enter__(self):          pass -    def __exit__(self,a,b,c): + +    def __exit__(self, a, b, c):          pass  empty_lock = EmptyLock() +  class PubnubCoreAsync(PubnubBase): -    def start(self): pass  -    def stop(self):  pass +    def start(self): +        pass + +    def stop(self): +        pass      def __init__(          self,          publish_key,          subscribe_key, -        secret_key = False, -        cipher_key = False, -        auth_key = None, -        ssl_on = False, -        origin = 'pubsub.pubnub.com', -        uuid = None, +        secret_key=False, +        cipher_key=False, +        auth_key=None, +        ssl_on=False, +        origin='pubsub.pubnub.com', +        uuid=None,          _tt_lock=empty_lock,          _channel_list_lock=empty_lock -    ) : +    ):          """          #**          #* Pubnub @@ -58,18 +64,18 @@ class PubnubCoreAsync(PubnubBase):              ssl_on=ssl_on,              origin=origin,              UUID=uuid -        )         - -        self.subscriptions              = {} -        self.timetoken                  = 0 -        self.last_timetoken             = 0 -        self.version                    = '3.3.4' -        self.accept_encoding            = 'gzip' -        self.SUB_RECEIVER               = None -        self._connect                   = None -        self._tt_lock                   = _tt_lock -        self._channel_list_lock         = _channel_list_lock -        self._connect                   = lambda: None +        ) + +        self.subscriptions = {} +        self.timetoken = 0 +        self.last_timetoken = 0 +        self.version = '3.3.4' +        self.accept_encoding = 'gzip' +        self.SUB_RECEIVER = None +        self._connect = None +        self._tt_lock = _tt_lock +        self._channel_list_lock = _channel_list_lock +        self._connect = lambda: None      def get_channel_list(self, channels):          channel = '' @@ -101,7 +107,8 @@ class PubnubCoreAsync(PubnubBase):          for i in l:              func(i) -    def subscribe( self, channel, callback, error=None, connect=None, disconnect=None, reconnect=None, sync=False ) : +    def subscribe(self, channel, callback, error=None, +                  connect=None, disconnect=None, reconnect=None, sync=False):          """          #**          #* Subscribe @@ -135,14 +142,15 @@ class PubnubCoreAsync(PubnubBase):          """          with self._tt_lock: -            self.last_timetoken = self.timetoken if self.timetoken != 0 else self.last_timetoken +            self.last_timetoken = self.timetoken if self.timetoken != 0 \ +                else self.last_timetoken              self.timetoken = 0          if sync is True and self.susbcribe_sync is not None:              self.susbcribe_sync(args)              return -        def _invoke(func,msg=None): +        def _invoke(func, msg=None):              if func is not None:                  if msg is not None:                      func(msg) @@ -156,17 +164,17 @@ class PubnubCoreAsync(PubnubBase):                          chobj = self.subscriptions[ch]                          if chobj['connected'] is False:                              chobj['connected'] = True -                            _invoke(chobj['connect'],chobj['name']) +                            _invoke(chobj['connect'], chobj['name'])          def _invoke_error(channel_list=None, err=None):              if channel_list is None:                  for ch in self.subscriptions:                      chobj = self.subscriptions[ch] -                    _invoke(chobj['error'],err) +                    _invoke(chobj['error'], err)              else:                  for ch in channel_list:                      chobj = self.subscriptions[ch] -                    _invoke(chobj['error'],err) +                    _invoke(chobj['error'], err)          def _get_channel():              for ch in self.subscriptions: @@ -174,53 +182,58 @@ class PubnubCoreAsync(PubnubBase):                  if chobj['subscribed'] is True:                      return chobj -          ## New Channel? -        if not channel in self.subscriptions or self.subscriptions[channel]['subscribed'] is False: -            with self._channel_list_lock: -                self.subscriptions[channel] = { -                    'name'          : channel, -                    'first'         : False, -                    'connected'     : False, -                    'subscribed'    : True, -                    'callback'      : callback, -                    'connect'       : connect, -                    'disconnect'    : disconnect, -                    'reconnect'     : reconnect, -                    'error'         : error -                } - +        if not channel in self.subscriptions or \ +                self.subscriptions[channel]['subscribed'] is False: +                with self._channel_list_lock: +                    self.subscriptions[channel] = { +                        'name': channel, +                        'first': False, +                        'connected': False, +                        'subscribed': True, +                        'callback': callback, +                        'connect': connect, +                        'disconnect': disconnect, +                        'reconnect': reconnect, +                        'error': error +                    }          ## return if already connected to channel -        if channel in self.subscriptions and 'connected' in self.subscriptions[channel] and self.subscriptions[channel]['connected'] is True: -            _invoke(error, "Already Connected") -            return -             -             +        if channel in self.subscriptions and \ +            'connected' in self.subscriptions[channel] and \ +                self.subscriptions[channel]['connected'] is True: +                    _invoke(error, "Already Connected") +                    return -        ## SUBSCRIPTION RECURSION  +        ## SUBSCRIPTION RECURSION          def _connect(): -           +              self._reset_offline()              def sub_callback(response):                  ## ERROR ? -                if not response or ('message' in response and response['message'] == 'Forbidden'): -                    _invoke_error(response['payload']['channels'], response['message']) -                    _connect() -                    return +                if not response or \ +                    ('message' in response and +                        response['message'] == 'Forbidden'): +                            _invoke_error(response['payload'][ +                                'channels'], response['message']) +                            _connect() +                            return                  _invoke_connect()                  with self._tt_lock: -                    self.timetoken = self.last_timetoken if self.timetoken == 0 and self.last_timetoken != 0 else response[1] +                    self.timetoken = \ +                        self.last_timetoken if self.timetoken == 0 and \ +                        self.last_timetoken != 0 else response[1]                      if len(response) > 2:                          channel_list = response[2].split(',')                          response_list = response[0]                          for ch in enumerate(channel_list):                              if ch[1] in self.subscriptions:                                  chobj = self.subscriptions[ch[1]] -                                _invoke(chobj['callback'],self.decrypt(response_list[ch[0]])) +                                _invoke(chobj['callback'], +                                        self.decrypt(response_list[ch[0]]))                      else:                          response_list = response[0]                          chobj = _get_channel() @@ -230,23 +243,25 @@ class PubnubCoreAsync(PubnubBase):                      _connect() -              channel_list = self.get_channel_list(self.subscriptions)              if len(channel_list) <= 0:                  return              ## CONNECT TO PUBNUB SUBSCRIBE SERVERS              try: -                self.SUB_RECEIVER = self._request( { "urlcomponents" : [ +                self.SUB_RECEIVER = self._request({"urlcomponents": [                      'subscribe',                      self.subscribe_key,                      channel_list,                      '0',                      str(self.timetoken) -                ], "urlparams" : {"uuid":self.uuid, "auth" : self.auth_key} }, sub_callback, sub_callback, single=True ) +                ], "urlparams": {"uuid": self.uuid, "auth": self.auth_key}}, +                    sub_callback, +                    sub_callback, +                    single=True)              except Exception as e:                  print(e) -                self.timeout( 1, _connect) +                self.timeout(1, _connect)                  return          self._connect = _connect @@ -263,8 +278,7 @@ class PubnubCoreAsync(PubnubBase):          self._reset_offline()          self._connect() - -    def unsubscribe( self, channel ): +    def unsubscribe(self, channel):          if channel in self.subscriptions is False:              return False @@ -272,8 +286,8 @@ class PubnubCoreAsync(PubnubBase):          ## DISCONNECT          with self._channel_list_lock:              if channel in self.subscriptions: -                self.subscriptions[channel]['connected']    = 0 -                self.subscriptions[channel]['subscribed']   = False -                self.subscriptions[channel]['timetoken']    = 0 -                self.subscriptions[channel]['first']        = False +                self.subscriptions[channel]['connected'] = 0 +                self.subscriptions[channel]['subscribed'] = False +                self.subscriptions[channel]['timetoken'] = 0 +                self.subscriptions[channel]['first'] = False          self.CONNECT() diff --git a/common/PubnubCrypto.py b/common/PubnubCrypto.py index 3489216..295a76e 100644 --- a/common/PubnubCrypto.py +++ b/common/PubnubCrypto.py @@ -1,10 +1,11 @@  from Crypto.Cipher import AES  from Crypto.Hash import MD5 -from base64 import encodestring, decodestring  +from base64 import encodestring, decodestring  import hashlib  import hmac -class PubnubCrypto2() : + +class PubnubCrypto2():      """      #**      #* PubnubCrypto @@ -15,8 +16,8 @@ class PubnubCrypto2() :      pc = PubnubCrypto      """ -    -    def pad( self, msg, block_size=16 ): + +    def pad(self, msg, block_size=16):          """          #**          #* pad @@ -28,9 +29,9 @@ class PubnubCrypto2() :          #**          """          padding = block_size - (len(msg) % block_size) -        return msg + chr(padding)*padding -        -    def depad( self, msg ): +        return msg + chr(padding) * padding + +    def depad(self, msg):          """          #**          #* depad @@ -41,7 +42,7 @@ class PubnubCrypto2() :          """          return msg[0:-ord(msg[-1])] -    def getSecret( self, key ): +    def getSecret(self, key):          """          #**          #* getSecret @@ -52,7 +53,7 @@ class PubnubCrypto2() :          """          return hashlib.sha256(key).hexdigest() -    def encrypt( self, key, msg ): +    def encrypt(self, key, msg):          """          #**          #* encrypt @@ -62,11 +63,12 @@ class PubnubCrypto2() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes)          enc = encodestring(cipher.encrypt(self.pad(msg)))          return enc -    def decrypt( self, key, msg ): + +    def decrypt(self, key, msg):          """          #**          #* decrypt @@ -76,12 +78,12 @@ class PubnubCrypto2() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes)          return self.depad((cipher.decrypt(decodestring(msg)))) -class PubnubCrypto3() : +class PubnubCrypto3():      """      #**      #* PubnubCrypto @@ -92,8 +94,8 @@ class PubnubCrypto3() :      pc = PubnubCrypto      """ -    -    def pad( self, msg, block_size=16 ): + +    def pad(self, msg, block_size=16):          """          #**          #* pad @@ -105,9 +107,9 @@ class PubnubCrypto3() :          #**          """          padding = block_size - (len(msg) % block_size) -        return msg + (chr(padding)*padding).encode('utf-8') -        -    def depad( self, msg ): +        return msg + (chr(padding) * padding).encode('utf-8') + +    def depad(self, msg):          """          #**          #* depad @@ -118,7 +120,7 @@ class PubnubCrypto3() :          """          return msg[0:-ord(msg[-1])] -    def getSecret( self, key ): +    def getSecret(self, key):          """          #**          #* getSecret @@ -129,7 +131,7 @@ class PubnubCrypto3() :          """          return hashlib.sha256(key.encode("utf-8")).hexdigest() -    def encrypt( self, key, msg ): +    def encrypt(self, key, msg):          """          #**          #* encrypt @@ -139,10 +141,12 @@ class PubnubCrypto3() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) -        return encodestring(cipher.encrypt(self.pad(msg.encode('utf-8')))).decode('utf-8') -    def decrypt( self, key, msg ): +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes) +        return encodestring( +            cipher.encrypt(self.pad(msg.encode('utf-8')))).decode('utf-8') + +    def decrypt(self, key, msg):          """          #**          #* decrypt @@ -152,6 +156,7 @@ class PubnubCrypto3() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) -        return (cipher.decrypt(decodestring(msg.encode('utf-8')))).decode('utf-8') +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes) +        return (cipher.decrypt( +            decodestring(msg.encode('utf-8')))).decode('utf-8') diff --git a/common/PubnubUnitTest.py b/common/PubnubUnitTest.py index 2f9d28c..518d226 100644 --- a/common/PubnubUnitTest.py +++ b/common/PubnubUnitTest.py @@ -1,36 +1,37 @@  import time +  class Suite(): -	def __init__(self, pubnub, expected): -		self.pubnub = pubnub -		self.total = expected -		self.passed = 0 -		self.failed = 0 -		self.started = False +    def __init__(self, pubnub, expected): +        self.pubnub = pubnub +        self.total = expected +        self.passed = 0 +        self.failed = 0 +        self.started = False -	def test(self, condition , name, message = None, response = None): +    def test(self, condition, name, message=None, response=None): -		if condition: -			self.passed += 1 -			msg = "PASS : " + name -			if message: -				msg += ", " + message -			if response: -				msg += ", " + response -			print msg -		else: -			self.failed += 1 -			msg = "FAIL : " + name -			if message: -				msg += ", " + message -			if response: -				msg += ", " + response -			print msg +        if condition: +            self.passed += 1 +            msg = "PASS : " + name +            if message: +                msg += ", " + message +            if response: +                msg += ", " + response +            print msg +        else: +            self.failed += 1 +            msg = "FAIL : " + name +            if message: +                msg += ", " + message +            if response: +                msg += ", " + response +            print msg -		if self.total == self.failed + self.passed: -			print "\n======== RESULT ========" -			print "Total\t:\t", self.total -			print "Passed\t:\t", self.passed -			print "Failed\t:\t", self.failed -			self.pubnub.stop() +        if self.total == self.failed + self.passed: +            print "\n======== RESULT ========" +            print "Total\t:\t", self.total +            print "Passed\t:\t", self.passed +            print "Failed\t:\t", self.failed +            self.pubnub.stop() diff --git a/common/unit-test-async.py b/common/unit-test-async.py index f95c759..8123fdb 100644 --- a/common/unit-test-async.py +++ b/common/unit-test-async.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -17,42 +17,45 @@ sys.path.append('./')  sys.path.append('../common/')  from Pubnub import Pubnub -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or None  -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or None -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or None +cipher_key = len(sys.argv) > 4 and sys.argv[4] or None +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Initiat Class  ## ----------------------------------------------------------------------- -pubnub = Pubnub( publish_key, subscribe_key, secret_key, cipher_key, ssl_on ) +pubnub = Pubnub(publish_key, subscribe_key, secret_key, cipher_key, ssl_on)  ch = 'python-async-test-channel-'  expect = 0  done = 0  failures = 0  passes = 0 +  def stop():      global done      global count      pubnub.stop()      print "============================" -    print 'Total\t:\t' , failures + passes -    print 'PASS\t:\t' , passes +    print 'Total\t:\t', failures + passes +    print 'PASS\t:\t', passes      print 'FAIL\t:\t', failures      print "============================"  ## ---------------------------------------------------------------------------  ## Unit Test Function  ## --------------------------------------------------------------------------- -def test( trial, name ) : + + +def test(trial, name):      global failures      global passes      global done      done += 1      #print trial -    if trial == False: +    if trial is False:          print 'FAIL : ', name          failures += 1      else: @@ -61,77 +64,87 @@ def test( trial, name ) :      if done == expect:          stop() +  def test_publish():      channel = ch + str(random.random()) +      def publish_cb(messages):          test(messages[0] == 1, "Publish Test")      pubnub.publish({ -        'channel' : channel, -        'message' :  {'one': 'Hello World! --> ɂ顶@#$%^&*()!', 'two': 'hello2'}, -        'callback' : publish_cb -    })  +        'channel': channel, +        'message': {'one': 'Hello World! --> ɂ顶@#$%^&*()!', 'two': 'hello2'}, +        'callback': publish_cb +    })  def test_history():      channel = ch + str(random.random()) +      def history_cb(messages): -        test(len(messages) <= 1, "History Test")     +        test(len(messages) <= 1, "History Test")      pubnub.history({ -        'channel' : channel, -        'limit' :  1, -        'callback' : history_cb  +        'channel': channel, +        'limit': 1, +        'callback': history_cb      }) -  def test_subscribe():      message = "Testing Subscribe " + str(random.random())      channel = ch + str(random.random()) +      def subscribe_connect_cb():          def publish_cb(response): -            test(response[0] == 1, 'Publish Test in subscribe Connect Callback') +            test(response[0] == 1, +                 'Publish Test in subscribe Connect Callback')          pubnub.publish({ -            'channel'  :  channel, -            'message'  :  message, -            'callback' : publish_cb +            'channel': channel, +            'message': message, +            'callback': publish_cb          }) +      def subscribe_cb(response): -        test(response == message , 'Subscribe Receive Test in subscribe Callback') +        test(response == message, +             'Subscribe Receive Test in subscribe Callback')      pubnub.subscribe({ -        'channel' : channel, -        'connect' : subscribe_connect_cb, +        'channel': channel, +        'connect': subscribe_connect_cb,          'callback': subscribe_cb -    })  -     +    }) +  def test_here_now(): -    channel = ch + str(random.random())  +    channel = ch + str(random.random())      message = "Testing Subscribe" +      def subscribe_connect_cb():          def here_now_cb(response):              test(response["occupancy"] > 0, 'Here Now Test') +              def publish_cb(response): -                test(response[0] == 1, 'Here Now Test: Publish Test in subscribe Connect Callback') +                test(response[0] == 1, +                     'Here Now Test: Publish Test in \ +                            subscribe Connect Callback')              pubnub.publish({ -                'channel'  : channel, -                'message'  : message, -                'callback' : publish_cb +                'channel': channel, +                'message': message, +                'callback': publish_cb              })          time.sleep(5)          pubnub.here_now({ -            'channel' : channel, -            'callback' : here_now_cb +            'channel': channel, +            'callback': here_now_cb          }) -      def subscribe_cb(response): -        test(response == message , 'Here Now Test: Subscribe Receive Test in subscribe Callback') +        test(response == message, +             'Here Now Test: Subscribe Receive Test in subscribe Callback')      pubnub.subscribe({ -        'channel' : channel, -        'connect' : subscribe_connect_cb, +        'channel': channel, +        'connect': subscribe_connect_cb,          'callback': subscribe_cb -    })  +    })  expect = 7  test_publish() @@ -140,7 +153,6 @@ test_subscribe()  test_here_now() -  pubnub.start()  if failures > 0:      raise Exception('Fail', failures) diff --git a/python-tornado/Pubnub.py b/python-tornado/Pubnub.py index 5607df0..718d74e 100644 --- a/python-tornado/Pubnub.py +++ b/python-tornado/Pubnub.py @@ -12,11 +12,12 @@  from Crypto.Cipher import AES  from Crypto.Hash import MD5 -from base64 import encodestring, decodestring  +from base64 import encodestring, decodestring  import hashlib  import hmac -class PubnubCrypto2() : + +class PubnubCrypto2():      """      #**      #* PubnubCrypto @@ -27,8 +28,8 @@ class PubnubCrypto2() :      pc = PubnubCrypto      """ -    -    def pad( self, msg, block_size=16 ): + +    def pad(self, msg, block_size=16):          """          #**          #* pad @@ -40,9 +41,9 @@ class PubnubCrypto2() :          #**          """          padding = block_size - (len(msg) % block_size) -        return msg + chr(padding)*padding -        -    def depad( self, msg ): +        return msg + chr(padding) * padding + +    def depad(self, msg):          """          #**          #* depad @@ -53,7 +54,7 @@ class PubnubCrypto2() :          """          return msg[0:-ord(msg[-1])] -    def getSecret( self, key ): +    def getSecret(self, key):          """          #**          #* getSecret @@ -64,7 +65,7 @@ class PubnubCrypto2() :          """          return hashlib.sha256(key).hexdigest() -    def encrypt( self, key, msg ): +    def encrypt(self, key, msg):          """          #**          #* encrypt @@ -74,11 +75,12 @@ class PubnubCrypto2() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes)          enc = encodestring(cipher.encrypt(self.pad(msg)))          return enc -    def decrypt( self, key, msg ): + +    def decrypt(self, key, msg):          """          #**          #* decrypt @@ -88,12 +90,12 @@ class PubnubCrypto2() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes)          return self.depad((cipher.decrypt(decodestring(msg)))) -class PubnubCrypto3() : +class PubnubCrypto3():      """      #**      #* PubnubCrypto @@ -104,8 +106,8 @@ class PubnubCrypto3() :      pc = PubnubCrypto      """ -    -    def pad( self, msg, block_size=16 ): + +    def pad(self, msg, block_size=16):          """          #**          #* pad @@ -117,9 +119,9 @@ class PubnubCrypto3() :          #**          """          padding = block_size - (len(msg) % block_size) -        return msg + (chr(padding)*padding).encode('utf-8') -        -    def depad( self, msg ): +        return msg + (chr(padding) * padding).encode('utf-8') + +    def depad(self, msg):          """          #**          #* depad @@ -130,7 +132,7 @@ class PubnubCrypto3() :          """          return msg[0:-ord(msg[-1])] -    def getSecret( self, key ): +    def getSecret(self, key):          """          #**          #* getSecret @@ -141,7 +143,7 @@ class PubnubCrypto3() :          """          return hashlib.sha256(key.encode("utf-8")).hexdigest() -    def encrypt( self, key, msg ): +    def encrypt(self, key, msg):          """          #**          #* encrypt @@ -151,10 +153,12 @@ class PubnubCrypto3() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) -        return encodestring(cipher.encrypt(self.pad(msg.encode('utf-8')))).decode('utf-8') -    def decrypt( self, key, msg ): +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes) +        return encodestring( +            cipher.encrypt(self.pad(msg.encode('utf-8')))).decode('utf-8') + +    def decrypt(self, key, msg):          """          #**          #* decrypt @@ -164,40 +168,46 @@ class PubnubCrypto3() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) -        return (cipher.decrypt(decodestring(msg.encode('utf-8')))).decode('utf-8') +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes) +        return (cipher.decrypt( +            decodestring(msg.encode('utf-8')))).decode('utf-8') -try: import json -except ImportError: import simplejson as json +try: +    import json +except ImportError: +    import simplejson as json  import time  import hashlib  import uuid  import sys -try: from urllib.parse  import quote -except: from urllib2 import quote +try: +    from urllib.parse import quote +except: +    from urllib2 import quote -from base64  import urlsafe_b64encode +from base64 import urlsafe_b64encode  from hashlib import sha256  import hmac +  class PubnubBase(object):      def __init__(          self,          publish_key,          subscribe_key, -        secret_key = False, -        cipher_key = False, -        auth_key = None, -        ssl_on = False, -        origin = 'pubsub.pubnub.com', -        UUID = None -    ) : +        secret_key=False, +        cipher_key=False, +        auth_key=None, +        ssl_on=False, +        origin='pubsub.pubnub.com', +        UUID=None +    ):          """          #**          #* Pubnub @@ -209,45 +219,47 @@ class PubnubBase(object):          #* @param string secret_key optional key to sign messages.          #* @param boolean ssl required for 2048 bit encrypted messages.          #* @param string origin PUBNUB Server Origin. -        #* @param string pres_uuid optional identifier for presence (auto-generated if not supplied) +        #* @param string pres_uuid optional identifier +        #*    for presence (auto-generated if not supplied)          #**          ## Initiat Class          pubnub = Pubnub( 'PUBLISH-KEY', 'SUBSCRIBE-KEY', 'SECRET-KEY', False )          """ -        self.origin        = origin -        self.limit         = 1800 -        self.publish_key   = publish_key +        self.origin = origin +        self.limit = 1800 +        self.publish_key = publish_key          self.subscribe_key = subscribe_key -        self.secret_key    = secret_key -        self.cipher_key    = cipher_key -        self.ssl           = ssl_on -        self.auth_key      = auth_key +        self.secret_key = secret_key +        self.cipher_key = cipher_key +        self.ssl = ssl_on +        self.auth_key = auth_key - -        if self.ssl : +        if self.ssl:              self.origin = 'https://' + self.origin -        else : -            self.origin = 'http://'  + self.origin -         +        else: +            self.origin = 'http://' + self.origin +          self.uuid = UUID or str(uuid.uuid4())          if type(sys.version_info) is tuple: -            self.python_version  = 2 -            self.pc              = PubnubCrypto2() +            self.python_version = 2 +            self.pc = PubnubCrypto2()          else:              if sys.version_info.major == 2: -                self.python_version  = 2 -                self.pc              = PubnubCrypto2() +                self.python_version = 2 +                self.pc = PubnubCrypto2()              else:                  self.python_version = 3 -                self.pc             = PubnubCrypto3() -         +                self.pc = PubnubCrypto3() +          if not isinstance(self.uuid, str):              raise AttributeError("pres_uuid must be a string") -    def sign(self, channel, message): +    ''' + +    def _sign(self, channel, message):          ## Sign Message          if self.secret_key:              signature = hashlib.md5('/'.join([ @@ -260,8 +272,9 @@ class PubnubBase(object):          else:              signature = '0'          return signature +    ''' -    def _pam_sign( self, msg ): +    def _pam_sign(self, msg):          """Calculate a signature by secret key and message."""          return urlsafe_b64encode(hmac.new( @@ -270,7 +283,7 @@ class PubnubBase(object):              sha256          ).digest()) -    def _pam_auth( self, query , apicode=0, callback=None): +    def _pam_auth(self, query, apicode=0, callback=None):          """Issue an authenticated request."""          if 'timestamp' not in query: @@ -297,57 +310,50 @@ class PubnubBase(object):          query['signature'] = self._pam_sign(sign_input) -        ''' -        url = ("https://pubsub.pubnub.com/v1/auth/{apitype}/sub-key/".format(apitype="audit" if (apicode) else "grant") + -            self.subscribe_key + "?" + -            params + "&signature=" + -            quote(signature, safe="")) -        ''' -          return self._request({"urlcomponents": [ -            'v1', 'auth', "audit" if (apicode) else "grant" ,  +            'v1', 'auth', "audit" if (apicode) else "grant",              'sub-key',              self.subscribe_key -        ], 'urlparams' : query},  -        self._return_wrapped_callback(callback)) +        ], 'urlparams': query}, +            self._return_wrapped_callback(callback)) -    def grant( self, channel, authkey=False, read=True, write=True, ttl=5, callback=None): +    def grant(self, channel, authkey=False, read=True, +              write=True, ttl=5, callback=None):          """Grant Access on a Channel."""          return self._pam_auth({ -            "channel" : channel, -            "auth"    : authkey, -            "r"       : read  and 1 or 0, -            "w"       : write and 1 or 0, -            "ttl"     : ttl +            "channel": channel, +            "auth": authkey, +            "r": read and 1 or 0, +            "w": write and 1 or 0, +            "ttl": ttl          }, callback=callback) -    def revoke( self, channel, authkey=False, ttl=1, callback=None): +    def revoke(self, channel, authkey=False, ttl=1, callback=None):          """Revoke Access on a Channel."""          return self._pam_auth({ -            "channel" : channel, -            "auth"    : authkey, -            "r"       : 0, -            "w"       : 0, -            "ttl"     : ttl +            "channel": channel, +            "auth": authkey, +            "r": 0, +            "w": 0, +            "ttl": ttl          }, callback=callback)      def audit(self, channel=False, authkey=False, callback=None):          return self._pam_auth({ -            "channel" : channel, -            "auth"    : authkey -        },1, callback=callback) -             - +            "channel": channel, +            "auth": authkey +        }, 1, callback=callback)      def encrypt(self, message):          if self.cipher_key: -            message = json.dumps(self.pc.encrypt(self.cipher_key, json.dumps(message)).replace('\n','')) -        else : +            message = json.dumps(self.pc.encrypt( +                self.cipher_key, json.dumps(message)).replace('\n', '')) +        else:              message = json.dumps(message) -        return message; +        return message      def decrypt(self, message):          if self.cipher_key: @@ -358,16 +364,18 @@ class PubnubBase(object):      def _return_wrapped_callback(self, callback=None):          def _new_format_callback(response):              if 'payload' in response: -                if (callback != None): callback({'message' : response['message'], 'payload' : response['payload']}) +                if (callback is not None): +                    callback({'message': response['message'], +                              'payload': response['payload']})              else: -                if (callback != None):callback(response) -        if (callback != None): +                if (callback is not None): +                    callback(response) +        if (callback is not None):              return _new_format_callback          else:              return None - -    def publish( self, args ) : +    def publish(channel, message, callback=None, error=None):          """          #**          #* Publish @@ -388,28 +396,9 @@ class PubnubBase(object):          print(info)          """ -        ## Fail if bad input. -        if not (args['channel'] and args['message']) : -            return [ 0, 'Missing Channel or Message' ] - -        ## Capture User Input -        channel = str(args['channel']) - -        ## Capture Callback -        if 'callback' in args : -            callback = args['callback'] -        else : -            callback = None - -        if 'error' in args : -            error = args['error'] -        else : -            error = None          message = self.encrypt(args['message']) -        #signature = self.sign(channel, message) -          ## Send Message          return self._request({"urlcomponents": [              'publish', @@ -419,10 +408,11 @@ class PubnubBase(object):              channel,              '0',              message -        ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback),  -        error=self._return_wrapped_callback(error)) -     -    def presence( self, args ) : +        ], 'urlparams': {'auth': self.auth_key}}, +            callback=self._return_wrapped_callback(callback), +            error=self._return_wrapped_callback(error)) + +    def presence(self, channel, callback, error=None):          """          #**          #* presence @@ -441,29 +431,15 @@ class PubnubBase(object):          pubnub.presence({              'channel'  : 'hello_world', -            'callback' : receive  +            'callback' : receive          })          """ +        return self.subscribe({ +            'channel': channel + '-pnpres', +            'subscribe_key': self.subscribe_key, +            'callback': self._return_wrapped_callback(callback)}) -        ## Fail if missing channel -        if not 'channel' in args : -            raise Exception('Missing Channel.') -            return False - -        ## Fail if missing callback -        if not 'callback' in args : -            raise Exception('Missing Callback.') -            return False - -        ## Capture User Input -        channel   = str(args['channel']) -        callback  = args['callback'] -        subscribe_key = args.get('subscribe_key') or self.subscribe_key -         -        return self.subscribe({'channel': channel+'-pnpres', 'subscribe_key':subscribe_key, 'callback': self._return_wrapped_callback(callback)}) -     -     -    def here_now( self, args ) : +    def here_now(self, channel, callback, error=None):          """          #**          #* Here Now @@ -484,33 +460,31 @@ class PubnubBase(object):          """          channel = str(args['channel']) - -        callback    = args['callback']  if 'callback'  in args else None -        error       = args['error']     if 'error'     in args else None +        callback = args['callback'] if 'callback' in args else None +        error = args['error'] if 'error' in args else None          ## Fail if bad input. -        if not channel : +        if not channel:              raise Exception('Missing Channel')              return False -         +          ## Get Presence Here Now          return self._request({"urlcomponents": [ -            'v2','presence', +            'v2', 'presence',              'sub_key', self.subscribe_key,              'channel', channel -        ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback),  -        error=self._return_wrapped_callback(error)) +        ], 'urlparams': {'auth': self.auth_key}}, +            callback=self._return_wrapped_callback(callback), +            error=self._return_wrapped_callback(error)) -    def history(self, args) : +    def history(self, channel, count=100, reverse=False, +                start=None, end=None, callback=None, error=None):          """          #**          #* History          #*          #* Load history from a channel.          #* -        #* @param array args with 'channel', optional: 'start', 'end', 'reverse', 'count' -        #* @return mixed false on fail, array on success. -        #*          ## History Example          history = pubnub.detailedHistory({ @@ -520,36 +494,27 @@ class PubnubBase(object):          print(history)          """ -        ## Capture User Input -        channel = str(args['channel']) -        callback            = args['callback']      if 'callback'  in args else None -        error               = args['error']         if 'error'     in args else None +        params = dict() -        params = dict()  - -        params['count']     = str(args['count'])           if 'count'   in args else 100 -        params['reverse']   = str(args['reverse']).lower() if 'reverse' in args else 'false' -        params['start']     = str(args['start'])           if 'start'   in args else None -        params['end']       = str(args['end'])             if 'end'     in args else None - -        ## Fail if bad input. -        if not channel : -            raise Exception('Missing Channel') -            return False +        params['count'] = count +        params['reverse'] = reverse +        params['start'] = start +        params['end'] = end          ## Get History -        return self._request({ 'urlcomponents' : [ +        return self._request({'urlcomponents': [              'v2',              'history',              'sub-key',              self.subscribe_key,              'channel',              channel, -        ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback),  -        error=self._return_wrapped_callback(error)) +        ], 'urlparams': {'auth': self.auth_key}}, +            callback=self._return_wrapped_callback(callback), +            error=self._return_wrapped_callback(error)) -    def time(self, args = None) : +    def time(self, callback=None):          """          #**          #* Time @@ -564,34 +529,31 @@ class PubnubBase(object):          print(timestamp)          """ -        ## Capture Callback -        callback = callback if args and 'callback' in args else None - -        time = self._request({'urlcomponents' : [ +        time = self._request({'urlcomponents': [              'time',              '0'          ]}, callback) -        if time != None: +        if time is not None:              return time[0] - -    def _encode( self, request ) : +    def _encode(self, request):          return [ -            "".join([ ' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and -                hex(ord(ch)).replace( '0x', '%' ).upper() or -                ch for ch in list(bit) -            ]) for bit in request] -     -    def getUrl(self,request): +            "".join([' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and +                     hex(ord(ch)).replace('0x', '%').upper() or +                     ch for ch in list(bit) +                     ]) for bit in request] + +    def getUrl(self, request):          ## Build URL          url = self.origin + '/' + "/".join([ -            "".join([ ' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and -                hex(ord(ch)).replace( '0x', '%' ).upper() or -                ch for ch in list(bit) -            ]) for bit in request["urlcomponents"]]) +            "".join([' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and +                     hex(ord(ch)).replace('0x', '%').upper() or +                     ch for ch in list(bit) +                     ]) for bit in request["urlcomponents"]])          if ("urlparams" in request): -            url = url + '?' + "&".join([ x + "=" + str(y)  for x,y in request["urlparams"].items() if y is not None]) +            url = url + '?' + "&".join([x + "=" + str(y) for x, y in request[ +                "urlparams"].items() if y is not None])          return url @@ -603,32 +565,38 @@ except ImportError:      sha256 = digestmod.new  import hmac +  class EmptyLock():      def __enter__(self):          pass -    def __exit__(self,a,b,c): + +    def __exit__(self, a, b, c):          pass  empty_lock = EmptyLock() +  class PubnubCoreAsync(PubnubBase): -    def start(self): pass  -    def stop(self):  pass +    def start(self): +        pass + +    def stop(self): +        pass      def __init__(          self,          publish_key,          subscribe_key, -        secret_key = False, -        cipher_key = False, -        auth_key = None, -        ssl_on = False, -        origin = 'pubsub.pubnub.com', -        uuid = None, +        secret_key=False, +        cipher_key=False, +        auth_key=None, +        ssl_on=False, +        origin='pubsub.pubnub.com', +        uuid=None,          _tt_lock=empty_lock,          _channel_list_lock=empty_lock -    ) : +    ):          """          #**          #* Pubnub @@ -655,18 +623,18 @@ class PubnubCoreAsync(PubnubBase):              ssl_on=ssl_on,              origin=origin,              UUID=uuid -        )         - -        self.subscriptions              = {} -        self.timetoken                  = 0 -        self.last_timetoken             = 0 -        self.version                    = '3.3.4' -        self.accept_encoding            = 'gzip' -        self.SUB_RECEIVER               = None -        self._connect                   = None -        self._tt_lock                   = _tt_lock -        self._channel_list_lock         = _channel_list_lock -        self._connect                   = lambda: None +        ) + +        self.subscriptions = {} +        self.timetoken = 0 +        self.last_timetoken = 0 +        self.version = '3.3.4' +        self.accept_encoding = 'gzip' +        self.SUB_RECEIVER = None +        self._connect = None +        self._tt_lock = _tt_lock +        self._channel_list_lock = _channel_list_lock +        self._connect = lambda: None      def get_channel_list(self, channels):          channel = '' @@ -698,7 +666,8 @@ class PubnubCoreAsync(PubnubBase):          for i in l:              func(i) -    def subscribe( self, args=None, sync=False ) : +    def subscribe(self, channel, callback, error=None, +                  connect=None, disconnect=None, reconnect=None, sync=False):          """          #**          #* Subscribe @@ -730,32 +699,17 @@ class PubnubCoreAsync(PubnubBase):          })          """ -        if args is None: -            _invoke(error, "Arguments Missing") -            return -        channel         = args['channel']       if 'channel'    in args else None -        callback        = args['callback']      if 'callback'   in args else None -        connect         = args['connect']       if 'connect'    in args else None -        disconnect      = args['disconnect']    if 'disconnect' in args else None -        reconnect       = args['reconnect']     if 'reconnect'  in args else None -        error           = args['error']         if 'error'      in args else None          with self._tt_lock: -            self.last_timetoken = self.timetoken if self.timetoken != 0 else self.last_timetoken +            self.last_timetoken = self.timetoken if self.timetoken != 0 \ +                else self.last_timetoken              self.timetoken = 0 -        if channel is None: -            _invoke(error, "Channel Missing") -            return -        if callback is None: -            _invoke(error, "Callback Missing") -            return -          if sync is True and self.susbcribe_sync is not None:              self.susbcribe_sync(args)              return -        def _invoke(func,msg=None): +        def _invoke(func, msg=None):              if func is not None:                  if msg is not None:                      func(msg) @@ -769,27 +723,17 @@ class PubnubCoreAsync(PubnubBase):                          chobj = self.subscriptions[ch]                          if chobj['connected'] is False:                              chobj['connected'] = True -                            _invoke(chobj['connect'],chobj['name']) +                            _invoke(chobj['connect'], chobj['name'])          def _invoke_error(channel_list=None, err=None):              if channel_list is None:                  for ch in self.subscriptions:                      chobj = self.subscriptions[ch] -                    _invoke(chobj['error'],err) +                    _invoke(chobj['error'], err)              else:                  for ch in channel_list:                      chobj = self.subscriptions[ch] -                    _invoke(chobj['error'],err) - -        ''' -        if callback is None: -            _invoke(error, "Callback Missing") -            return - -        if channel is None: -            _invoke(error, "Channel Missing") -            return -        ''' +                    _invoke(chobj['error'], err)          def _get_channel():              for ch in self.subscriptions: @@ -797,53 +741,58 @@ class PubnubCoreAsync(PubnubBase):                  if chobj['subscribed'] is True:                      return chobj -          ## New Channel? -        if not channel in self.subscriptions or self.subscriptions[channel]['subscribed'] is False: -            with self._channel_list_lock: -                self.subscriptions[channel] = { -                    'name'          : channel, -                    'first'         : False, -                    'connected'     : False, -                    'subscribed'    : True, -                    'callback'      : callback, -                    'connect'       : connect, -                    'disconnect'    : disconnect, -                    'reconnect'     : reconnect, -                    'error'         : error -                } - +        if not channel in self.subscriptions or \ +                self.subscriptions[channel]['subscribed'] is False: +                with self._channel_list_lock: +                    self.subscriptions[channel] = { +                        'name': channel, +                        'first': False, +                        'connected': False, +                        'subscribed': True, +                        'callback': callback, +                        'connect': connect, +                        'disconnect': disconnect, +                        'reconnect': reconnect, +                        'error': error +                    }          ## return if already connected to channel -        if channel in self.subscriptions and 'connected' in self.subscriptions[channel] and self.subscriptions[channel]['connected'] is True: -            _invoke(error, "Already Connected") -            return -             -             +        if channel in self.subscriptions and \ +            'connected' in self.subscriptions[channel] and \ +                self.subscriptions[channel]['connected'] is True: +                    _invoke(error, "Already Connected") +                    return -        ## SUBSCRIPTION RECURSION  +        ## SUBSCRIPTION RECURSION          def _connect(): -           +              self._reset_offline()              def sub_callback(response):                  ## ERROR ? -                if not response or ('message' in response and response['message'] == 'Forbidden'): -                    _invoke_error(response['payload']['channels'], response['message']) -                    _connect() -                    return +                if not response or \ +                    ('message' in response and +                        response['message'] == 'Forbidden'): +                            _invoke_error(response['payload'][ +                                'channels'], response['message']) +                            _connect() +                            return                  _invoke_connect()                  with self._tt_lock: -                    self.timetoken = self.last_timetoken if self.timetoken == 0 and self.last_timetoken != 0 else response[1] +                    self.timetoken = \ +                        self.last_timetoken if self.timetoken == 0 and \ +                        self.last_timetoken != 0 else response[1]                      if len(response) > 2:                          channel_list = response[2].split(',')                          response_list = response[0]                          for ch in enumerate(channel_list):                              if ch[1] in self.subscriptions:                                  chobj = self.subscriptions[ch[1]] -                                _invoke(chobj['callback'],self.decrypt(response_list[ch[0]])) +                                _invoke(chobj['callback'], +                                        self.decrypt(response_list[ch[0]]))                      else:                          response_list = response[0]                          chobj = _get_channel() @@ -853,23 +802,25 @@ class PubnubCoreAsync(PubnubBase):                      _connect() -              channel_list = self.get_channel_list(self.subscriptions)              if len(channel_list) <= 0:                  return              ## CONNECT TO PUBNUB SUBSCRIBE SERVERS              try: -                self.SUB_RECEIVER = self._request( { "urlcomponents" : [ +                self.SUB_RECEIVER = self._request({"urlcomponents": [                      'subscribe',                      self.subscribe_key,                      channel_list,                      '0',                      str(self.timetoken) -                ], "urlparams" : {"uuid":self.uuid, "auth" : self.auth_key} }, sub_callback, sub_callback, single=True ) +                ], "urlparams": {"uuid": self.uuid, "auth": self.auth_key}}, +                    sub_callback, +                    sub_callback, +                    single=True)              except Exception as e:                  print(e) -                self.timeout( 1, _connect) +                self.timeout(1, _connect)                  return          self._connect = _connect @@ -886,22 +837,18 @@ class PubnubCoreAsync(PubnubBase):          self._reset_offline()          self._connect() +    def unsubscribe(self, channel): -    def unsubscribe( self, args ): - -        if 'channel' in self.subscriptions is False: +        if channel in self.subscriptions is False:              return False -        channel = str(args['channel']) - -          ## DISCONNECT          with self._channel_list_lock:              if channel in self.subscriptions: -                self.subscriptions[channel]['connected']    = 0 -                self.subscriptions[channel]['subscribed']   = False -                self.subscriptions[channel]['timetoken']    = 0 -                self.subscriptions[channel]['first']        = False +                self.subscriptions[channel]['connected'] = 0 +                self.subscriptions[channel]['subscribed'] = False +                self.subscriptions[channel]['timetoken'] = 0 +                self.subscriptions[channel]['first'] = False          self.CONNECT() @@ -920,23 +867,28 @@ from tornado.stack_context import ExceptionStackContext  ioloop = tornado.ioloop.IOLoop.instance() +  class Pubnub(PubnubCoreAsync): -    def stop(self): ioloop.stop() -    def start(self): ioloop.start() -    def timeout( self, delay, callback): -        ioloop.add_timeout( time.time()+float(delay), callback ) -         +    def stop(self): +        ioloop.stop() + +    def start(self): +        ioloop.start() + +    def timeout(self, delay, callback): +        ioloop.add_timeout(time.time() + float(delay), callback) +      def __init__(          self,          publish_key,          subscribe_key, -        secret_key = False, -        cipher_key = False, -        auth_key = False, -        ssl_on = False, -        origin = 'pubsub.pubnub.com' -    ) : +        secret_key=False, +        cipher_key=False, +        auth_key=False, +        ssl_on=False, +        origin='pubsub.pubnub.com' +    ):          super(Pubnub, self).__init__(              publish_key=publish_key,              subscribe_key=subscribe_key, @@ -945,22 +897,26 @@ class Pubnub(PubnubCoreAsync):              auth_key=auth_key,              ssl_on=ssl_on,              origin=origin, -        )         +        )          self.headers = {}          self.headers['User-Agent'] = 'Python-Tornado'          self.headers['Accept-Encoding'] = self.accept_encoding          self.headers['V'] = self.version          self.http = tornado.httpclient.AsyncHTTPClient(max_clients=1000)          self.id = None -         -    def _request( self, request, callback=None, error=None, single=False ) : + +    def _request(self, request, callback=None, error=None, single=False):          def _invoke(func, data):              if func is not None:                  func(data)          url = self.getUrl(request) -        request = tornado.httpclient.HTTPRequest( url, 'GET', self.headers, connect_timeout=10, request_timeout=310 ) +        request = tornado.httpclient.HTTPRequest( +            url, 'GET', +            self.headers, +            connect_timeout=10, +            request_timeout=310)          if single is True:              id = time.time()              self.id = id @@ -968,13 +924,14 @@ class Pubnub(PubnubCoreAsync):          def responseCallback(response):              if single is True:                  if not id == self.id: -                    return None  -                     +                    return None +              body = response._get_body()              if body is None:                  return              #print(body) +              def handle_exc(*args):                  return True              if response.error is not None: @@ -987,7 +944,7 @@ class Pubnub(PubnubCoreAsync):                  try:                      data = json.loads(body.decode("utf-8"))                  except: -                    _invoke(error, {'error' : 'json decode error'}) +                    _invoke(error, {'error': 'json decode error'})              if 'error' in data and 'status' in data and 'status' != 200:                  _invoke(error, data) @@ -1003,4 +960,3 @@ class Pubnub(PubnubCoreAsync):              pass          return abort - diff --git a/python-tornado/examples/here-now-example.py b/python-tornado/examples/here-now-example.py index 85e3432..e6e45a3 100644 --- a/python-tornado/examples/here-now-example.py +++ b/python-tornado/examples/here-now-example.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -15,28 +15,30 @@ sys.path.append('..')  sys.path.append('../../common')  from Pubnub import Pubnub -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or '' -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len(sys.argv) > 4 and sys.argv[4] or '' +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## ----------------------------------------------------------------------- -pubnub = Pubnub( publish_key, subscribe_key, secret_key, cipher_key, ssl_on ) -crazy  = 'hello_world' +pubnub = Pubnub(publish_key, subscribe_key, secret_key, cipher_key, ssl_on) +crazy = 'hello_world'  ## -----------------------------------------------------------------------  ## History Example  ## ----------------------------------------------------------------------- + +  def here_now_complete(messages):      print(messages)      pubnub.stop() -pubnub.here_now( { -    'channel'  : crazy, -    'callback' : here_now_complete +pubnub.here_now({ +    'channel': crazy, +    'callback': here_now_complete  })  ## ----------------------------------------------------------------------- diff --git a/python-tornado/examples/history-example.py b/python-tornado/examples/history-example.py index c1619f4..00bdaf3 100644 --- a/python-tornado/examples/history-example.py +++ b/python-tornado/examples/history-example.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -13,30 +13,32 @@ import sys  import tornado  from Pubnub import Pubnub -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or '' -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len(sys.argv) > 4 and sys.argv[4] or '' +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## ----------------------------------------------------------------------- -pubnub = Pubnub( publish_key, subscribe_key, secret_key,cipher_key, ssl_on ) -crazy  = 'hello_world' +pubnub = Pubnub(publish_key, subscribe_key, secret_key, cipher_key, ssl_on) +crazy = 'hello_world'  ## -----------------------------------------------------------------------  ## History Example  ## ----------------------------------------------------------------------- + +  def history_complete(messages):      print(messages)      tornado.ioloop.IOLoop.instance().stop() -pubnub.history( { -   'channel'  : crazy, -   'limit'    : 10, -   'callback' : history_complete -}) +pubnub.history({ +               'channel': crazy, +               'limit': 10, +               'callback': history_complete +               })  ## -----------------------------------------------------------------------  ## IO Event Loop diff --git a/python-tornado/examples/publish-example.py b/python-tornado/examples/publish-example.py index bb8b199..38d713c 100644 --- a/python-tornado/examples/publish-example.py +++ b/python-tornado/examples/publish-example.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -15,53 +15,59 @@ sys.path.append('../')  sys.path.append('../../')  from Pubnub import Pubnub -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or ''     ##(Cipher key is Optional) -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len( +    sys.argv) > 4 and sys.argv[4] or ''  # (Cipher key is Optional) +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## ----------------------------------------------------------------------- -pubnub = Pubnub( publish_key, subscribe_key, secret_key, cipher_key, ssl_on ) -crazy  = 'hello_world' +pubnub = Pubnub(publish_key, subscribe_key, secret_key, cipher_key, ssl_on) +crazy = 'hello_world'  ## -----------------------------------------------------------------------  ## Publish Example  ## ----------------------------------------------------------------------- + +  def publish_complete(info):      print(info) +  def publish_error(info): -    print('ERROR : ' +  str(info)) +    print('ERROR : ' + str(info))  ## Publish string  pubnub.publish({ -    'channel' : crazy, -    'message' : 'Hello World!', -    'callback' : publish_complete, -    'error' : publish_error +    'channel': crazy, +    'message': 'Hello World!', +    'callback': publish_complete, +    'error': publish_error  })  ## Publish list -li = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] +li = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', +      'Saturday']  pubnub.publish({ -    'channel' : crazy, -    'message' : li, -    'callback' : publish_complete, -    'error' : publish_error +    'channel': crazy, +    'message': li, +    'callback': publish_complete, +    'error': publish_error  }) +  def done_cb(info):      publish_complete(info)  pubnub.publish({ -    'channel' : crazy, -    'message' : { 'some_key' : 'some_val' }, -    'callback' : done_cb, -    'error' : publish_error +    'channel': crazy, +    'message': {'some_key': 'some_val'}, +    'callback': done_cb, +    'error': publish_error  }) diff --git a/python-tornado/examples/subscribe-example.py b/python-tornado/examples/subscribe-example.py index dfe8010..34ee886 100644 --- a/python-tornado/examples/subscribe-example.py +++ b/python-tornado/examples/subscribe-example.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -15,29 +15,33 @@ sys.path.append('../')  sys.path.append('../..')  from Pubnub import Pubnub -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or 'demo' ##(Cipher key is Optional) -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len( +    sys.argv) > 4 and sys.argv[4] or 'demo'  # (Cipher key is Optional) +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## ----------------------------------------------------------------------- -pubnub = Pubnub( publish_key=publish_key, subscribe_key=subscribe_key, secret_key=secret_key,cipher_key=cipher_key, ssl_on=ssl_on ) +pubnub = Pubnub(publish_key=publish_key, subscribe_key=subscribe_key, +                secret_key=secret_key, cipher_key=cipher_key, ssl_on=ssl_on)  #pubnub = Pubnub( publish_key, subscribe_key, secret_key, ssl_on ) -crazy  = 'hello_world' +crazy = 'hello_world' +  def connect_cb():      print 'Connect' +  def subscribe_result(response):      print response  pubnub.subscribe({ -    'channel' : crazy, -    'callback' : subscribe_result, -    'connect' : connect_cb  +    'channel': crazy, +    'callback': subscribe_result, +    'connect': connect_cb  })  ## -----------------------------------------------------------------------  ## Publish Example @@ -54,7 +58,8 @@ pubnub.publish({  })  ## Publish list -li = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] +li = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', +    'Saturday']  pubnub.publish({      'channel' : crazy,      'message' : li, diff --git a/python-tornado/examples/uuid-example.py b/python-tornado/examples/uuid-example.py index f24671b..33e19f8 100644 --- a/python-tornado/examples/uuid-example.py +++ b/python-tornado/examples/uuid-example.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -17,7 +17,7 @@ from Pubnub import Pubnub  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## ----------------------------------------------------------------------- -pubnub = Pubnub( "", "", "", False ) +pubnub = Pubnub("", "", "", False)  ## -----------------------------------------------------------------------  ## UUID Example @@ -25,4 +25,3 @@ pubnub = Pubnub( "", "", "", False )  uuid = pubnub.uuid()  print "UUID: "  print uuid - diff --git a/python-tornado/tests/delivery.py b/python-tornado/tests/delivery.py index f3633e6..cb04332 100644 --- a/python-tornado/tests/delivery.py +++ b/python-tornado/tests/delivery.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -20,92 +20,99 @@ from Pubnub import Pubnub  ## -----------------------------------------------------------------------  ## Configuration  ## ----------------------------------------------------------------------- -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or 'demo' -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False -origin        = len(sys.argv) > 6 and sys.argv[6] or 'pubsub.pubnub.com' +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len(sys.argv) > 4 and sys.argv[4] or 'demo' +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False +origin = len(sys.argv) > 6 and sys.argv[6] or 'pubsub.pubnub.com'  ## -----------------------------------------------------------------------  ## Analytics  ## -----------------------------------------------------------------------  analytics = { -    'publishes'            : 0,   ## Total Send Requests -    'received'             : 0,   ## Total Received Messages (Deliveries) -    'queued'               : 0,   ## Total Unreceived Queue (UnDeliveries) -    'successful_publishes' : 0,   ## Confirmed Successful Publish Request -    'failed_publishes'     : 0,   ## Confirmed UNSuccessful Publish Request -    'failed_deliveries'    : 0,   ## (successful_publishes - received) -    'deliverability'       : 0    ## Percentage Delivery +    'publishes': 0,  # Total Send Requests +    'received': 0,  # Total Received Messages (Deliveries) +    'queued': 0,  # Total Unreceived Queue (UnDeliveries) +    'successful_publishes': 0,  # Confirmed Successful Publish Request +    'failed_publishes': 0,  # Confirmed UNSuccessful Publish Request +    'failed_deliveries': 0,  # (successful_publishes - received) +    'deliverability': 0  # Percentage Delivery  }  trips = { -    'last'    : None, -    'current' : None, -    'max'     : 0, -    'avg'     : 0 +    'last': None, +    'current': None, +    'max': 0, +    'avg': 0  }  ## -----------------------------------------------------------------------  ## Initiat Class  ## -----------------------------------------------------------------------  channel = 'deliverability-' + str(time.time()) -pubnub  = Pubnub( +pubnub = Pubnub(      publish_key,      subscribe_key, -    secret_key = secret_key, -    cipher_key = cipher_key, -    ssl_on = ssl_on, -    origin = origin +    secret_key=secret_key, +    cipher_key=cipher_key, +    ssl_on=ssl_on, +    origin=origin  )  ## -----------------------------------------------------------------------  ## BENCHMARK  ## ----------------------------------------------------------------------- -def publish_sent(info = None): -    if info and info[0]: analytics['successful_publishes']   += 1 -    else:                analytics['failed_publishes']       += 1 + + +def publish_sent(info=None): +    if info and info[0]: +        analytics['successful_publishes'] += 1 +    else: +        analytics['failed_publishes'] += 1      analytics['publishes'] += 1 -    analytics['queued']    += 1 +    analytics['queued'] += 1 + +    pubnub.timeout(send, 0.1) -    pubnub.timeout( send, 0.1 )  def send():      if analytics['queued'] > 100:          analytics['queued'] -= 10 -        return pubnub.timeout( send, 10 ) +        return pubnub.timeout(send, 10)      pubnub.publish({ -        'channel'  : channel, -        'callback' : publish_sent, -        'message'  : "1234567890" +        'channel': channel, +        'callback': publish_sent, +        'message': "1234567890"      }) +  def received(message): -    analytics['queued']   -= 1 +    analytics['queued'] -= 1      analytics['received'] += 1      current_trip = trips['current'] = str(datetime.datetime.now())[0:19] -    last_trip    = trips['last']    = str( +    last_trip = trips['last'] = str(          datetime.datetime.now() - datetime.timedelta(seconds=1)      )[0:19]      ## New Trip Span (1 Second) -    if not trips.has_key(current_trip) : +    if current_trip not in trips:          trips[current_trip] = 0          ## Average -        if trips.has_key(last_trip): +        if last_trip in trips:              trips['avg'] = (trips['avg'] + trips[last_trip]) / 2      ## Increment Trip Counter      trips[current_trip] = trips[current_trip] + 1      ## Update Max -    if trips[current_trip] > trips['max'] : +    if trips[current_trip] > trips['max']:          trips['max'] = trips[current_trip] +  def show_status():      ## Update Failed Deliveries      analytics['failed_deliveries'] = \ @@ -114,45 +121,46 @@ def show_status():      ## Update Deliverability      analytics['deliverability'] = ( -        float(analytics['received']) / \ +        float(analytics['received']) /          float(analytics['successful_publishes'] or 1.0)      ) * 100.0      ## Print Display -    print( ( -       "max:%(max)03d/sec  "                  + \ -       "avg:%(avg)03d/sec  "                  + \ -       "pubs:%(publishes)05d  "               + \ -       "received:%(received)05d  "            + \ -       "spub:%(successful_publishes)05d  "    + \ -       "fpub:%(failed_publishes)05d  "        + \ -       "failed:%(failed_deliveries)05d  "     + \ -       "queued:%(queued)03d  "                + \ -       "delivery:%(deliverability)03f%%  "    + \ -       "" -    ) % { -        'max'                  : trips['max'], -        'avg'                  : trips['avg'], -        'publishes'            : analytics['publishes'], -        'received'             : analytics['received'], -        'successful_publishes' : analytics['successful_publishes'], -        'failed_publishes'     : analytics['failed_publishes'], -        'failed_deliveries'    : analytics['failed_deliveries'], -        'publishes'            : analytics['publishes'], -        'deliverability'       : analytics['deliverability'], -        'queued'               : analytics['queued'] -    } ) -    pubnub.timeout( show_status, 1 ) +    print(( +          "max:%(max)03d/sec  " + +          "avg:%(avg)03d/sec  " + +          "pubs:%(publishes)05d  " + +          "received:%(received)05d  " + +          "spub:%(successful_publishes)05d  " + +          "fpub:%(failed_publishes)05d  " + +          "failed:%(failed_deliveries)05d  " + +          "queued:%(queued)03d  " + +          "delivery:%(deliverability)03f%%  " + +          "" +          ) % { +          'max': trips['max'], +          'avg': trips['avg'], +          'publishes': analytics['publishes'], +          'received': analytics['received'], +          'successful_publishes': analytics['successful_publishes'], +          'failed_publishes': analytics['failed_publishes'], +          'failed_deliveries': analytics['failed_deliveries'], +          'publishes': analytics['publishes'], +          'deliverability': analytics['deliverability'], +          'queued': analytics['queued'] +          }) +    pubnub.timeout(show_status, 1) +  def connected():      show_status() -    pubnub.timeout( send, 1 ) +    pubnub.timeout(send, 1) -print( "Connected: %s\n" % origin ) +print("Connected: %s\n" % origin)  pubnub.subscribe({ -    'channel'  : channel, -    'connect'  : connected, -    'callback' : received +    'channel': channel, +    'connect': connected, +    'callback': received  })  ## ----------------------------------------------------------------------- diff --git a/python-tornado/tests/subscribe-test.py b/python-tornado/tests/subscribe-test.py index be4a416..d8a3ea2 100755 --- a/python-tornado/tests/subscribe-test.py +++ b/python-tornado/tests/subscribe-test.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -16,18 +16,18 @@ from Pubnub import Pubnub  from functools import partial  from threading import current_thread  import threading -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or None -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len(sys.argv) > 4 and sys.argv[4] or None +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## -----------------------------------------------------------------------  #pubnub = Pubnub( publish_key, subscribe_key, secret_key, cipher_key, ssl_on ) -pubnub = Pubnub( publish_key, subscribe_key, secret_key, ssl_on ) -crazy  = 'hello_world' +pubnub = Pubnub(publish_key, subscribe_key, secret_key, ssl_on) +crazy = 'hello_world'  current = -1 @@ -37,9 +37,12 @@ received = 0  ## -----------------------------------------------------------------------  ## Subscribe Example  ## ----------------------------------------------------------------------- + +  def message_received(message):      print(message) +  def check_received(message):      global current      global errors @@ -52,19 +55,20 @@ def check_received(message):          errors += 1      else:          received += 1 -    print('active thread count : ' + str( threading.activeCount())) +    print('active thread count : ' + str(threading.activeCount()))      print('errors = ' + str(errors)) -    print(current_thread().getName() +  ' , ' +  'received = ' +  str(received)) +    print(current_thread().getName() + ' , ' + 'received = ' + str(received))      if received != message: -        print('********** MISSED **************** ' + str( message - received )) +        print('********** MISSED **************** ' + str(message - received))      current = message -     -def connected_test(ch) : -    print('Connected '  +  ch) -def connected(ch) : +def connected_test(ch): +    print('Connected ' + ch) + + +def connected(ch):      pass @@ -75,56 +79,60 @@ pubnub.subscribe({      'callback' : message_received  })  ''' + +  def cb1(): -	pubnub.subscribe({ -	    'channel'  : 'efgh1', -	    'connect'  : connected, -	    'callback' : message_received -	}) +    pubnub.subscribe({ +        'channel': 'efgh1', +        'connect': connected, +        'callback': message_received +    }) +  def cb2(): -	pubnub.subscribe({ -	    'channel'  : 'dsm-test', -	    'connect'  : connected_test, -	    'callback' : check_received -	}) +    pubnub.subscribe({ +        'channel': 'dsm-test', +        'connect': connected_test, +        'callback': check_received +    }) +  def cb3(): -    pubnub.unsubscribe({'channel' : 'efgh1'}) +    pubnub.unsubscribe({'channel': 'efgh1'}) -def cb4(): -    pubnub.unsubscribe({'channel' : 'abcd1'}) -def subscribe(channel): -	pubnub.subscribe({ -	    'channel'  : channel, -	    'connect'  : connected, -	    'callback' : message_received -	}) +def cb4(): +    pubnub.unsubscribe({'channel': 'abcd1'}) +def subscribe(channel): +    pubnub.subscribe({ +        'channel': channel, +        'connect': connected, +        'callback': message_received +    }) -pubnub.timeout(15,cb1) +pubnub.timeout(15, cb1) -pubnub.timeout(30,cb2) +pubnub.timeout(30, cb2) -pubnub.timeout(45,cb3) +pubnub.timeout(45, cb3) -pubnub.timeout(60,cb4) +pubnub.timeout(60, cb4)  #''' -for x in range(1,1000): +for x in range(1, 1000):      #print x      def y(t):          subscribe('channel-' + str(t))      def z(t): -        pubnub.unsubscribe({'channel' : 'channel-' + str(t)}) +        pubnub.unsubscribe({'channel': 'channel-' + str(t)}) -    pubnub.timeout(x + 5, partial(y,x)) -    pubnub.timeout(x + 25, partial(z, x))  +    pubnub.timeout(x + 5, partial(y, x)) +    pubnub.timeout(x + 25, partial(z, x))      x += 10  #''' diff --git a/python-tornado/tests/unit-tests.py b/python-tornado/tests/unit-tests.py index fdaa194..b4b51f4 100644 --- a/python-tornado/tests/unit-tests.py +++ b/python-tornado/tests/unit-tests.py @@ -9,65 +9,63 @@ sys.path.append('.')  from PubnubUnitTest import Suite  from Pubnub import Pubnub -pubnub = Pubnub("demo","demo") +pubnub = Pubnub("demo", "demo")  tests_count = 1 + 2 -test_suite = Suite(pubnub,tests_count) +test_suite = Suite(pubnub, tests_count)  tests = []  def test_publish(): -	name = "Publish Test" -	def success(r): -		test_suite.test(r[0] == 1, name) +    name = "Publish Test" -	def fail(e): -		test_suite.test(False, msg , e) +    def success(r): +        test_suite.test(r[0] == 1, name) +    def fail(e): +        test_suite.test(False, msg, e) -	pubnub.publish({ -		'channel' : 'hello', -		'message' : 'hi', -		'callback' : success, -		'error' : fail -	}) +    pubnub.publish({ +                   'channel': 'hello', +                   'message': 'hi', +                   'callback': success, +                   'error': fail +                   })  tests.append(test_publish)  def test_subscribe_publish(): -	channel = "hello" -	name = "Subscribe Publish Test" -	publish_msg = "This is Pubnub Python-Twisted" -	def connect(): -		def success(r): -			test_suite.test(r[0] == 1, name, "publish success") - -		def fail(e): -			test_suite.test(False, name , "Publish Failed", e) - -		pubnub.publish({ -			'channel' : channel, -			'message' : publish_msg, -			'callback' : success, -			'error' : fail -		}) - -	def callback(r): -		test_suite.test(r == publish_msg, name, "message received") - -	pubnub.subscribe({ -		'channel' : channel, -		'callback' : callback, -		'connect' : connect -	}) +    channel = "hello" +    name = "Subscribe Publish Test" +    publish_msg = "This is Pubnub Python-Twisted" + +    def connect(): +        def success(r): +            test_suite.test(r[0] == 1, name, "publish success") + +        def fail(e): +            test_suite.test(False, name, "Publish Failed", e) + +        pubnub.publish({ +                       'channel': channel, +                       'message': publish_msg, +                       'callback': success, +                       'error': fail +                       }) + +    def callback(r): +        test_suite.test(r == publish_msg, name, "message received") + +    pubnub.subscribe({ +                     'channel': channel, +                     'callback': callback, +                     'connect': connect +                     })  tests.append(test_subscribe_publish) - - -  for t in tests: -	t() +    t()  pubnub.start() diff --git a/python-tornado/unassembled/Platform.py b/python-tornado/unassembled/Platform.py index 02c374d..871a400 100644 --- a/python-tornado/unassembled/Platform.py +++ b/python-tornado/unassembled/Platform.py @@ -13,23 +13,28 @@ from tornado.stack_context import ExceptionStackContext  ioloop = tornado.ioloop.IOLoop.instance() +  class Pubnub(PubnubCoreAsync): -    def stop(self): ioloop.stop() -    def start(self): ioloop.start() -    def timeout( self, delay, callback): -        ioloop.add_timeout( time.time()+float(delay), callback ) -         +    def stop(self): +        ioloop.stop() + +    def start(self): +        ioloop.start() + +    def timeout(self, delay, callback): +        ioloop.add_timeout(time.time() + float(delay), callback) +      def __init__(          self,          publish_key,          subscribe_key, -        secret_key = False, -        cipher_key = False, -        auth_key = False, -        ssl_on = False, -        origin = 'pubsub.pubnub.com' -    ) : +        secret_key=False, +        cipher_key=False, +        auth_key=False, +        ssl_on=False, +        origin='pubsub.pubnub.com' +    ):          super(Pubnub, self).__init__(              publish_key=publish_key,              subscribe_key=subscribe_key, @@ -38,22 +43,26 @@ class Pubnub(PubnubCoreAsync):              auth_key=auth_key,              ssl_on=ssl_on,              origin=origin, -        )         +        )          self.headers = {}          self.headers['User-Agent'] = 'Python-Tornado'          self.headers['Accept-Encoding'] = self.accept_encoding          self.headers['V'] = self.version          self.http = tornado.httpclient.AsyncHTTPClient(max_clients=1000)          self.id = None -         -    def _request( self, request, callback=None, error=None, single=False ) : + +    def _request(self, request, callback=None, error=None, single=False):          def _invoke(func, data):              if func is not None:                  func(data)          url = self.getUrl(request) -        request = tornado.httpclient.HTTPRequest( url, 'GET', self.headers, connect_timeout=10, request_timeout=310 ) +        request = tornado.httpclient.HTTPRequest( +            url, 'GET', +            self.headers, +            connect_timeout=10, +            request_timeout=310)          if single is True:              id = time.time()              self.id = id @@ -61,13 +70,14 @@ class Pubnub(PubnubCoreAsync):          def responseCallback(response):              if single is True:                  if not id == self.id: -                    return None  -                     +                    return None +              body = response._get_body()              if body is None:                  return              #print(body) +              def handle_exc(*args):                  return True              if response.error is not None: @@ -80,7 +90,7 @@ class Pubnub(PubnubCoreAsync):                  try:                      data = json.loads(body.decode("utf-8"))                  except: -                    _invoke(error, {'error' : 'json decode error'}) +                    _invoke(error, {'error': 'json decode error'})              if 'error' in data and 'status' in data and 'status' != 200:                  _invoke(error, data) @@ -96,4 +106,3 @@ class Pubnub(PubnubCoreAsync):              pass          return abort - diff --git a/python-twisted/Pubnub.py b/python-twisted/Pubnub.py index f5259ac..c312033 100644 --- a/python-twisted/Pubnub.py +++ b/python-twisted/Pubnub.py @@ -12,11 +12,12 @@  from Crypto.Cipher import AES  from Crypto.Hash import MD5 -from base64 import encodestring, decodestring  +from base64 import encodestring, decodestring  import hashlib  import hmac -class PubnubCrypto2() : + +class PubnubCrypto2():      """      #**      #* PubnubCrypto @@ -27,8 +28,8 @@ class PubnubCrypto2() :      pc = PubnubCrypto      """ -    -    def pad( self, msg, block_size=16 ): + +    def pad(self, msg, block_size=16):          """          #**          #* pad @@ -40,9 +41,9 @@ class PubnubCrypto2() :          #**          """          padding = block_size - (len(msg) % block_size) -        return msg + chr(padding)*padding -        -    def depad( self, msg ): +        return msg + chr(padding) * padding + +    def depad(self, msg):          """          #**          #* depad @@ -53,7 +54,7 @@ class PubnubCrypto2() :          """          return msg[0:-ord(msg[-1])] -    def getSecret( self, key ): +    def getSecret(self, key):          """          #**          #* getSecret @@ -64,7 +65,7 @@ class PubnubCrypto2() :          """          return hashlib.sha256(key).hexdigest() -    def encrypt( self, key, msg ): +    def encrypt(self, key, msg):          """          #**          #* encrypt @@ -74,11 +75,12 @@ class PubnubCrypto2() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes)          enc = encodestring(cipher.encrypt(self.pad(msg)))          return enc -    def decrypt( self, key, msg ): + +    def decrypt(self, key, msg):          """          #**          #* decrypt @@ -88,12 +90,12 @@ class PubnubCrypto2() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes)          return self.depad((cipher.decrypt(decodestring(msg)))) -class PubnubCrypto3() : +class PubnubCrypto3():      """      #**      #* PubnubCrypto @@ -104,8 +106,8 @@ class PubnubCrypto3() :      pc = PubnubCrypto      """ -    -    def pad( self, msg, block_size=16 ): + +    def pad(self, msg, block_size=16):          """          #**          #* pad @@ -117,9 +119,9 @@ class PubnubCrypto3() :          #**          """          padding = block_size - (len(msg) % block_size) -        return msg + (chr(padding)*padding).encode('utf-8') -        -    def depad( self, msg ): +        return msg + (chr(padding) * padding).encode('utf-8') + +    def depad(self, msg):          """          #**          #* depad @@ -130,7 +132,7 @@ class PubnubCrypto3() :          """          return msg[0:-ord(msg[-1])] -    def getSecret( self, key ): +    def getSecret(self, key):          """          #**          #* getSecret @@ -141,7 +143,7 @@ class PubnubCrypto3() :          """          return hashlib.sha256(key.encode("utf-8")).hexdigest() -    def encrypt( self, key, msg ): +    def encrypt(self, key, msg):          """          #**          #* encrypt @@ -151,10 +153,12 @@ class PubnubCrypto3() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) -        return encodestring(cipher.encrypt(self.pad(msg.encode('utf-8')))).decode('utf-8') -    def decrypt( self, key, msg ): +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes) +        return encodestring( +            cipher.encrypt(self.pad(msg.encode('utf-8')))).decode('utf-8') + +    def decrypt(self, key, msg):          """          #**          #* decrypt @@ -164,40 +168,46 @@ class PubnubCrypto3() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) -        return (cipher.decrypt(decodestring(msg.encode('utf-8')))).decode('utf-8') +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes) +        return (cipher.decrypt( +            decodestring(msg.encode('utf-8')))).decode('utf-8') -try: import json -except ImportError: import simplejson as json +try: +    import json +except ImportError: +    import simplejson as json  import time  import hashlib  import uuid  import sys -try: from urllib.parse  import quote -except: from urllib2 import quote +try: +    from urllib.parse import quote +except: +    from urllib2 import quote -from base64  import urlsafe_b64encode +from base64 import urlsafe_b64encode  from hashlib import sha256  import hmac +  class PubnubBase(object):      def __init__(          self,          publish_key,          subscribe_key, -        secret_key = False, -        cipher_key = False, -        auth_key = None, -        ssl_on = False, -        origin = 'pubsub.pubnub.com', -        UUID = None -    ) : +        secret_key=False, +        cipher_key=False, +        auth_key=None, +        ssl_on=False, +        origin='pubsub.pubnub.com', +        UUID=None +    ):          """          #**          #* Pubnub @@ -209,45 +219,47 @@ class PubnubBase(object):          #* @param string secret_key optional key to sign messages.          #* @param boolean ssl required for 2048 bit encrypted messages.          #* @param string origin PUBNUB Server Origin. -        #* @param string pres_uuid optional identifier for presence (auto-generated if not supplied) +        #* @param string pres_uuid optional identifier +        #*    for presence (auto-generated if not supplied)          #**          ## Initiat Class          pubnub = Pubnub( 'PUBLISH-KEY', 'SUBSCRIBE-KEY', 'SECRET-KEY', False )          """ -        self.origin        = origin -        self.limit         = 1800 -        self.publish_key   = publish_key +        self.origin = origin +        self.limit = 1800 +        self.publish_key = publish_key          self.subscribe_key = subscribe_key -        self.secret_key    = secret_key -        self.cipher_key    = cipher_key -        self.ssl           = ssl_on -        self.auth_key      = auth_key - +        self.secret_key = secret_key +        self.cipher_key = cipher_key +        self.ssl = ssl_on +        self.auth_key = auth_key -        if self.ssl : +        if self.ssl:              self.origin = 'https://' + self.origin -        else : -            self.origin = 'http://'  + self.origin -         +        else: +            self.origin = 'http://' + self.origin +          self.uuid = UUID or str(uuid.uuid4())          if type(sys.version_info) is tuple: -            self.python_version  = 2 -            self.pc              = PubnubCrypto2() +            self.python_version = 2 +            self.pc = PubnubCrypto2()          else:              if sys.version_info.major == 2: -                self.python_version  = 2 -                self.pc              = PubnubCrypto2() +                self.python_version = 2 +                self.pc = PubnubCrypto2()              else:                  self.python_version = 3 -                self.pc             = PubnubCrypto3() -         +                self.pc = PubnubCrypto3() +          if not isinstance(self.uuid, str):              raise AttributeError("pres_uuid must be a string") -    def sign(self, channel, message): +    ''' + +    def _sign(self, channel, message):          ## Sign Message          if self.secret_key:              signature = hashlib.md5('/'.join([ @@ -260,8 +272,9 @@ class PubnubBase(object):          else:              signature = '0'          return signature +    ''' -    def _pam_sign( self, msg ): +    def _pam_sign(self, msg):          """Calculate a signature by secret key and message."""          return urlsafe_b64encode(hmac.new( @@ -270,7 +283,7 @@ class PubnubBase(object):              sha256          ).digest()) -    def _pam_auth( self, query , apicode=0, callback=None): +    def _pam_auth(self, query, apicode=0, callback=None):          """Issue an authenticated request."""          if 'timestamp' not in query: @@ -297,57 +310,50 @@ class PubnubBase(object):          query['signature'] = self._pam_sign(sign_input) -        ''' -        url = ("https://pubsub.pubnub.com/v1/auth/{apitype}/sub-key/".format(apitype="audit" if (apicode) else "grant") + -            self.subscribe_key + "?" + -            params + "&signature=" + -            quote(signature, safe="")) -        ''' -          return self._request({"urlcomponents": [ -            'v1', 'auth', "audit" if (apicode) else "grant" ,  +            'v1', 'auth', "audit" if (apicode) else "grant",              'sub-key',              self.subscribe_key -        ], 'urlparams' : query},  -        self._return_wrapped_callback(callback)) +        ], 'urlparams': query}, +            self._return_wrapped_callback(callback)) -    def grant( self, channel, authkey=False, read=True, write=True, ttl=5, callback=None): +    def grant(self, channel, authkey=False, read=True, +              write=True, ttl=5, callback=None):          """Grant Access on a Channel."""          return self._pam_auth({ -            "channel" : channel, -            "auth"    : authkey, -            "r"       : read  and 1 or 0, -            "w"       : write and 1 or 0, -            "ttl"     : ttl +            "channel": channel, +            "auth": authkey, +            "r": read and 1 or 0, +            "w": write and 1 or 0, +            "ttl": ttl          }, callback=callback) -    def revoke( self, channel, authkey=False, ttl=1, callback=None): +    def revoke(self, channel, authkey=False, ttl=1, callback=None):          """Revoke Access on a Channel."""          return self._pam_auth({ -            "channel" : channel, -            "auth"    : authkey, -            "r"       : 0, -            "w"       : 0, -            "ttl"     : ttl +            "channel": channel, +            "auth": authkey, +            "r": 0, +            "w": 0, +            "ttl": ttl          }, callback=callback)      def audit(self, channel=False, authkey=False, callback=None):          return self._pam_auth({ -            "channel" : channel, -            "auth"    : authkey -        },1, callback=callback) -             - +            "channel": channel, +            "auth": authkey +        }, 1, callback=callback)      def encrypt(self, message):          if self.cipher_key: -            message = json.dumps(self.pc.encrypt(self.cipher_key, json.dumps(message)).replace('\n','')) -        else : +            message = json.dumps(self.pc.encrypt( +                self.cipher_key, json.dumps(message)).replace('\n', '')) +        else:              message = json.dumps(message) -        return message; +        return message      def decrypt(self, message):          if self.cipher_key: @@ -358,16 +364,18 @@ class PubnubBase(object):      def _return_wrapped_callback(self, callback=None):          def _new_format_callback(response):              if 'payload' in response: -                if (callback != None): callback({'message' : response['message'], 'payload' : response['payload']}) +                if (callback is not None): +                    callback({'message': response['message'], +                              'payload': response['payload']})              else: -                if (callback != None):callback(response) -        if (callback != None): +                if (callback is not None): +                    callback(response) +        if (callback is not None):              return _new_format_callback          else:              return None - -    def publish( self, args ) : +    def publish(channel, message, callback=None, error=None):          """          #**          #* Publish @@ -388,28 +396,9 @@ class PubnubBase(object):          print(info)          """ -        ## Fail if bad input. -        if not (args['channel'] and args['message']) : -            return [ 0, 'Missing Channel or Message' ] - -        ## Capture User Input -        channel = str(args['channel']) - -        ## Capture Callback -        if 'callback' in args : -            callback = args['callback'] -        else : -            callback = None - -        if 'error' in args : -            error = args['error'] -        else : -            error = None          message = self.encrypt(args['message']) -        #signature = self.sign(channel, message) -          ## Send Message          return self._request({"urlcomponents": [              'publish', @@ -419,10 +408,11 @@ class PubnubBase(object):              channel,              '0',              message -        ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback),  -        error=self._return_wrapped_callback(error)) -     -    def presence( self, args ) : +        ], 'urlparams': {'auth': self.auth_key}}, +            callback=self._return_wrapped_callback(callback), +            error=self._return_wrapped_callback(error)) + +    def presence(self, channel, callback, error=None):          """          #**          #* presence @@ -441,29 +431,15 @@ class PubnubBase(object):          pubnub.presence({              'channel'  : 'hello_world', -            'callback' : receive  +            'callback' : receive          })          """ +        return self.subscribe({ +            'channel': channel + '-pnpres', +            'subscribe_key': self.subscribe_key, +            'callback': self._return_wrapped_callback(callback)}) -        ## Fail if missing channel -        if not 'channel' in args : -            raise Exception('Missing Channel.') -            return False - -        ## Fail if missing callback -        if not 'callback' in args : -            raise Exception('Missing Callback.') -            return False - -        ## Capture User Input -        channel   = str(args['channel']) -        callback  = args['callback'] -        subscribe_key = args.get('subscribe_key') or self.subscribe_key -         -        return self.subscribe({'channel': channel+'-pnpres', 'subscribe_key':subscribe_key, 'callback': self._return_wrapped_callback(callback)}) -     -     -    def here_now( self, args ) : +    def here_now(self, channel, callback, error=None):          """          #**          #* Here Now @@ -484,33 +460,31 @@ class PubnubBase(object):          """          channel = str(args['channel']) - -        callback    = args['callback']  if 'callback'  in args else None -        error       = args['error']     if 'error'     in args else None +        callback = args['callback'] if 'callback' in args else None +        error = args['error'] if 'error' in args else None          ## Fail if bad input. -        if not channel : +        if not channel:              raise Exception('Missing Channel')              return False -         +          ## Get Presence Here Now          return self._request({"urlcomponents": [ -            'v2','presence', +            'v2', 'presence',              'sub_key', self.subscribe_key,              'channel', channel -        ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback),  -        error=self._return_wrapped_callback(error)) +        ], 'urlparams': {'auth': self.auth_key}}, +            callback=self._return_wrapped_callback(callback), +            error=self._return_wrapped_callback(error)) -    def history(self, args) : +    def history(self, channel, count=100, reverse=False, +                start=None, end=None, callback=None, error=None):          """          #**          #* History          #*          #* Load history from a channel.          #* -        #* @param array args with 'channel', optional: 'start', 'end', 'reverse', 'count' -        #* @return mixed false on fail, array on success. -        #*          ## History Example          history = pubnub.detailedHistory({ @@ -520,36 +494,27 @@ class PubnubBase(object):          print(history)          """ -        ## Capture User Input -        channel = str(args['channel']) - -        callback            = args['callback']      if 'callback'  in args else None -        error               = args['error']         if 'error'     in args else None - -        params = dict()  -        params['count']     = str(args['count'])           if 'count'   in args else 100 -        params['reverse']   = str(args['reverse']).lower() if 'reverse' in args else 'false' -        params['start']     = str(args['start'])           if 'start'   in args else None -        params['end']       = str(args['end'])             if 'end'     in args else None +        params = dict() -        ## Fail if bad input. -        if not channel : -            raise Exception('Missing Channel') -            return False +        params['count'] = count +        params['reverse'] = reverse +        params['start'] = start +        params['end'] = end          ## Get History -        return self._request({ 'urlcomponents' : [ +        return self._request({'urlcomponents': [              'v2',              'history',              'sub-key',              self.subscribe_key,              'channel',              channel, -        ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback),  -        error=self._return_wrapped_callback(error)) +        ], 'urlparams': {'auth': self.auth_key}}, +            callback=self._return_wrapped_callback(callback), +            error=self._return_wrapped_callback(error)) -    def time(self, args = None) : +    def time(self, callback=None):          """          #**          #* Time @@ -564,34 +529,31 @@ class PubnubBase(object):          print(timestamp)          """ -        ## Capture Callback -        callback = callback if args and 'callback' in args else None - -        time = self._request({'urlcomponents' : [ +        time = self._request({'urlcomponents': [              'time',              '0'          ]}, callback) -        if time != None: +        if time is not None:              return time[0] - -    def _encode( self, request ) : +    def _encode(self, request):          return [ -            "".join([ ' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and -                hex(ord(ch)).replace( '0x', '%' ).upper() or -                ch for ch in list(bit) -            ]) for bit in request] -     -    def getUrl(self,request): +            "".join([' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and +                     hex(ord(ch)).replace('0x', '%').upper() or +                     ch for ch in list(bit) +                     ]) for bit in request] + +    def getUrl(self, request):          ## Build URL          url = self.origin + '/' + "/".join([ -            "".join([ ' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and -                hex(ord(ch)).replace( '0x', '%' ).upper() or -                ch for ch in list(bit) -            ]) for bit in request["urlcomponents"]]) +            "".join([' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and +                     hex(ord(ch)).replace('0x', '%').upper() or +                     ch for ch in list(bit) +                     ]) for bit in request["urlcomponents"]])          if ("urlparams" in request): -            url = url + '?' + "&".join([ x + "=" + str(y)  for x,y in request["urlparams"].items() if y is not None]) +            url = url + '?' + "&".join([x + "=" + str(y) for x, y in request[ +                "urlparams"].items() if y is not None])          return url @@ -603,32 +565,38 @@ except ImportError:      sha256 = digestmod.new  import hmac +  class EmptyLock():      def __enter__(self):          pass -    def __exit__(self,a,b,c): + +    def __exit__(self, a, b, c):          pass  empty_lock = EmptyLock() +  class PubnubCoreAsync(PubnubBase): -    def start(self): pass  -    def stop(self):  pass +    def start(self): +        pass + +    def stop(self): +        pass      def __init__(          self,          publish_key,          subscribe_key, -        secret_key = False, -        cipher_key = False, -        auth_key = None, -        ssl_on = False, -        origin = 'pubsub.pubnub.com', -        uuid = None, +        secret_key=False, +        cipher_key=False, +        auth_key=None, +        ssl_on=False, +        origin='pubsub.pubnub.com', +        uuid=None,          _tt_lock=empty_lock,          _channel_list_lock=empty_lock -    ) : +    ):          """          #**          #* Pubnub @@ -655,18 +623,18 @@ class PubnubCoreAsync(PubnubBase):              ssl_on=ssl_on,              origin=origin,              UUID=uuid -        )         - -        self.subscriptions              = {} -        self.timetoken                  = 0 -        self.last_timetoken             = 0 -        self.version                    = '3.3.4' -        self.accept_encoding            = 'gzip' -        self.SUB_RECEIVER               = None -        self._connect                   = None -        self._tt_lock                   = _tt_lock -        self._channel_list_lock         = _channel_list_lock -        self._connect                   = lambda: None +        ) + +        self.subscriptions = {} +        self.timetoken = 0 +        self.last_timetoken = 0 +        self.version = '3.3.4' +        self.accept_encoding = 'gzip' +        self.SUB_RECEIVER = None +        self._connect = None +        self._tt_lock = _tt_lock +        self._channel_list_lock = _channel_list_lock +        self._connect = lambda: None      def get_channel_list(self, channels):          channel = '' @@ -698,7 +666,8 @@ class PubnubCoreAsync(PubnubBase):          for i in l:              func(i) -    def subscribe( self, args=None, sync=False ) : +    def subscribe(self, channel, callback, error=None, +                  connect=None, disconnect=None, reconnect=None, sync=False):          """          #**          #* Subscribe @@ -730,32 +699,17 @@ class PubnubCoreAsync(PubnubBase):          })          """ -        if args is None: -            _invoke(error, "Arguments Missing") -            return -        channel         = args['channel']       if 'channel'    in args else None -        callback        = args['callback']      if 'callback'   in args else None -        connect         = args['connect']       if 'connect'    in args else None -        disconnect      = args['disconnect']    if 'disconnect' in args else None -        reconnect       = args['reconnect']     if 'reconnect'  in args else None -        error           = args['error']         if 'error'      in args else None          with self._tt_lock: -            self.last_timetoken = self.timetoken if self.timetoken != 0 else self.last_timetoken +            self.last_timetoken = self.timetoken if self.timetoken != 0 \ +                else self.last_timetoken              self.timetoken = 0 -        if channel is None: -            _invoke(error, "Channel Missing") -            return -        if callback is None: -            _invoke(error, "Callback Missing") -            return -          if sync is True and self.susbcribe_sync is not None:              self.susbcribe_sync(args)              return -        def _invoke(func,msg=None): +        def _invoke(func, msg=None):              if func is not None:                  if msg is not None:                      func(msg) @@ -769,27 +723,17 @@ class PubnubCoreAsync(PubnubBase):                          chobj = self.subscriptions[ch]                          if chobj['connected'] is False:                              chobj['connected'] = True -                            _invoke(chobj['connect'],chobj['name']) +                            _invoke(chobj['connect'], chobj['name'])          def _invoke_error(channel_list=None, err=None):              if channel_list is None:                  for ch in self.subscriptions:                      chobj = self.subscriptions[ch] -                    _invoke(chobj['error'],err) +                    _invoke(chobj['error'], err)              else:                  for ch in channel_list:                      chobj = self.subscriptions[ch] -                    _invoke(chobj['error'],err) - -        ''' -        if callback is None: -            _invoke(error, "Callback Missing") -            return - -        if channel is None: -            _invoke(error, "Channel Missing") -            return -        ''' +                    _invoke(chobj['error'], err)          def _get_channel():              for ch in self.subscriptions: @@ -797,53 +741,58 @@ class PubnubCoreAsync(PubnubBase):                  if chobj['subscribed'] is True:                      return chobj -          ## New Channel? -        if not channel in self.subscriptions or self.subscriptions[channel]['subscribed'] is False: -            with self._channel_list_lock: -                self.subscriptions[channel] = { -                    'name'          : channel, -                    'first'         : False, -                    'connected'     : False, -                    'subscribed'    : True, -                    'callback'      : callback, -                    'connect'       : connect, -                    'disconnect'    : disconnect, -                    'reconnect'     : reconnect, -                    'error'         : error -                } - +        if not channel in self.subscriptions or \ +                self.subscriptions[channel]['subscribed'] is False: +                with self._channel_list_lock: +                    self.subscriptions[channel] = { +                        'name': channel, +                        'first': False, +                        'connected': False, +                        'subscribed': True, +                        'callback': callback, +                        'connect': connect, +                        'disconnect': disconnect, +                        'reconnect': reconnect, +                        'error': error +                    }          ## return if already connected to channel -        if channel in self.subscriptions and 'connected' in self.subscriptions[channel] and self.subscriptions[channel]['connected'] is True: -            _invoke(error, "Already Connected") -            return -             -             +        if channel in self.subscriptions and \ +            'connected' in self.subscriptions[channel] and \ +                self.subscriptions[channel]['connected'] is True: +                    _invoke(error, "Already Connected") +                    return -        ## SUBSCRIPTION RECURSION  +        ## SUBSCRIPTION RECURSION          def _connect(): -           +              self._reset_offline()              def sub_callback(response):                  ## ERROR ? -                if not response or ('message' in response and response['message'] == 'Forbidden'): -                    _invoke_error(response['payload']['channels'], response['message']) -                    _connect() -                    return +                if not response or \ +                    ('message' in response and +                        response['message'] == 'Forbidden'): +                            _invoke_error(response['payload'][ +                                'channels'], response['message']) +                            _connect() +                            return                  _invoke_connect()                  with self._tt_lock: -                    self.timetoken = self.last_timetoken if self.timetoken == 0 and self.last_timetoken != 0 else response[1] +                    self.timetoken = \ +                        self.last_timetoken if self.timetoken == 0 and \ +                        self.last_timetoken != 0 else response[1]                      if len(response) > 2:                          channel_list = response[2].split(',')                          response_list = response[0]                          for ch in enumerate(channel_list):                              if ch[1] in self.subscriptions:                                  chobj = self.subscriptions[ch[1]] -                                _invoke(chobj['callback'],self.decrypt(response_list[ch[0]])) +                                _invoke(chobj['callback'], +                                        self.decrypt(response_list[ch[0]]))                      else:                          response_list = response[0]                          chobj = _get_channel() @@ -853,23 +802,25 @@ class PubnubCoreAsync(PubnubBase):                      _connect() -              channel_list = self.get_channel_list(self.subscriptions)              if len(channel_list) <= 0:                  return              ## CONNECT TO PUBNUB SUBSCRIBE SERVERS              try: -                self.SUB_RECEIVER = self._request( { "urlcomponents" : [ +                self.SUB_RECEIVER = self._request({"urlcomponents": [                      'subscribe',                      self.subscribe_key,                      channel_list,                      '0',                      str(self.timetoken) -                ], "urlparams" : {"uuid":self.uuid, "auth" : self.auth_key} }, sub_callback, sub_callback, single=True ) +                ], "urlparams": {"uuid": self.uuid, "auth": self.auth_key}}, +                    sub_callback, +                    sub_callback, +                    single=True)              except Exception as e:                  print(e) -                self.timeout( 1, _connect) +                self.timeout(1, _connect)                  return          self._connect = _connect @@ -886,22 +837,18 @@ class PubnubCoreAsync(PubnubBase):          self._reset_offline()          self._connect() +    def unsubscribe(self, channel): -    def unsubscribe( self, args ): - -        if 'channel' in self.subscriptions is False: +        if channel in self.subscriptions is False:              return False -        channel = str(args['channel']) - -          ## DISCONNECT          with self._channel_list_lock:              if channel in self.subscriptions: -                self.subscriptions[channel]['connected']    = 0 -                self.subscriptions[channel]['subscribed']   = False -                self.subscriptions[channel]['timetoken']    = 0 -                self.subscriptions[channel]['first']        = False +                self.subscriptions[channel]['connected'] = 0 +                self.subscriptions[channel]['subscribed'] = False +                self.subscriptions[channel]['timetoken'] = 0 +                self.subscriptions[channel]['first'] = False          self.CONNECT() @@ -909,7 +856,8 @@ from twisted.web.client import getPage  from twisted.internet import reactor  from twisted.internet.defer import Deferred  from twisted.internet.protocol import Protocol -from twisted.web.client import Agent, ContentDecoderAgent, RedirectAgent, GzipDecoder +from twisted.web.client import Agent, ContentDecoderAgent +from twisted.web.client import RedirectAgent, GzipDecoder  from twisted.web.client import HTTPConnectionPool  from twisted.web.http_headers import Headers  from twisted.internet.ssl import ClientContextFactory @@ -922,16 +870,21 @@ from twisted.python.compat import (      _PY3, unicode, intToBytes, networkString, nativeString)  pnconn_pool = HTTPConnectionPool(reactor, persistent=True) -pnconn_pool.maxPersistentPerHost    = 100000 +pnconn_pool.maxPersistentPerHost = 100000  pnconn_pool.cachedConnectionTimeout = 310  pnconn_pool.retryAutomatically = True +  class Pubnub(PubnubCoreAsync): -    def start(self): reactor.run() -    def stop(self):  reactor.stop() -    def timeout( self, delay, callback ): -        reactor.callLater( delay, callback ) +    def start(self): +        reactor.run() + +    def stop(self): +        reactor.stop() + +    def timeout(self, delay, callback): +        reactor.callLater(delay, callback)      def __init__(          self, @@ -940,9 +893,9 @@ class Pubnub(PubnubCoreAsync):          secret_key=False,          cipher_key=False,          auth_key=None, -        ssl_on = False, -        origin = 'pubsub.pubnub.com' -    ) : +        ssl_on=False, +        origin='pubsub.pubnub.com' +    ):          super(Pubnub, self).__init__(              publish_key=publish_key,              subscribe_key=subscribe_key, @@ -951,13 +904,13 @@ class Pubnub(PubnubCoreAsync):              auth_key=auth_key,              ssl_on=ssl_on,              origin=origin, -        )         +        )          self.headers = {}          self.headers['User-Agent'] = ['Python-Twisted']          #self.headers['Accept-Encoding'] = [self.accept_encoding]          self.headers['V'] = [self.version] -    def _request( self, request, callback=None, error=None, single=False ) : +    def _request(self, request, callback=None, error=None, single=False):          global pnconn_pool          def _invoke(func, data): @@ -974,18 +927,19 @@ class Pubnub(PubnubCoreAsync):          '''          url = self.getUrl(request) -        agent       = ContentDecoderAgent(RedirectAgent(Agent( +        agent = ContentDecoderAgent(RedirectAgent(Agent(              reactor, -            contextFactory = WebClientContextFactory(), -            pool = self.ssl and None or pnconn_pool +            contextFactory=WebClientContextFactory(), +            pool=self.ssl and None or pnconn_pool          )), [('gzip', GzipDecoder)])          try: -            request     = agent.request( 'GET', url, Headers(self.headers), None ) +            request = agent.request( +                'GET', url, Headers(self.headers), None)          except TypeError as te:              print(url.encode()) -            request     = agent.request( 'GET', url.encode(), Headers(self.headers), None ) - +            request = agent.request( +                'GET', url.encode(), Headers(self.headers), None)          if single is True:              id = time.time() @@ -1019,7 +973,7 @@ class Pubnub(PubnubCoreAsync):                  try:                      data = json.loads(data.decode("utf-8"))                  except: -                    _invoke(error, {'error' : 'json decode error'}) +                    _invoke(error, {'error': 'json decode error'})              if 'error' in data and 'status' in data and 'status' != 200:                  _invoke(error, data) @@ -1035,23 +989,25 @@ class Pubnub(PubnubCoreAsync):          return abort +  class WebClientContextFactory(ClientContextFactory):      def getContext(self, hostname, port):          return ClientContextFactory.getContext(self) +  class PubNub403Response(Protocol): -    def __init__( self, finished ): +    def __init__(self, finished):          self.finished = finished -    def dataReceived( self, bytes ): +    def dataReceived(self, bytes):          #print '403 resp ', bytes          self.finished.callback(bytes) -	    + +  class PubNubResponse(Protocol): -    def __init__( self, finished ): +    def __init__(self, finished):          self.finished = finished -    def dataReceived( self, bytes ): +    def dataReceived(self, bytes):          #print bytes          self.finished.callback(bytes) - diff --git a/python-twisted/examples/here-now-example.py b/python-twisted/examples/here-now-example.py index b3c9dc0..bba7d21 100644 --- a/python-twisted/examples/here-now-example.py +++ b/python-twisted/examples/here-now-example.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -13,28 +13,30 @@ import sys  from twisted.internet import reactor  from Pubnub import Pubnub -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or '' -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len(sys.argv) > 4 and sys.argv[4] or '' +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## ----------------------------------------------------------------------- -pubnub = Pubnub( publish_key, subscribe_key, secret_key, cipher_key, ssl_on ) -crazy  = 'hello_world' +pubnub = Pubnub(publish_key, subscribe_key, secret_key, cipher_key, ssl_on) +crazy = 'hello_world'  ## -----------------------------------------------------------------------  ## History Example  ## ----------------------------------------------------------------------- + +  def here_now_complete(messages):      print(messages)      reactor.stop() -pubnub.here_now( { -    'channel'  : crazy, -    'callback' : here_now_complete +pubnub.here_now({ +    'channel': crazy, +    'callback': here_now_complete  })  ## ----------------------------------------------------------------------- diff --git a/python-twisted/examples/history-example.py b/python-twisted/examples/history-example.py index 5f352ef..f128cd7 100644 --- a/python-twisted/examples/history-example.py +++ b/python-twisted/examples/history-example.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -14,29 +14,31 @@ from twisted.internet import reactor  sys.path.append('../')  from Pubnub import Pubnub -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or '' -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len(sys.argv) > 4 and sys.argv[4] or '' +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## ----------------------------------------------------------------------- -pubnub = Pubnub( publish_key, subscribe_key, secret_key, cipher_key, ssl_on ) -crazy  = 'hello_world' +pubnub = Pubnub(publish_key, subscribe_key, secret_key, cipher_key, ssl_on) +crazy = 'hello_world'  ## -----------------------------------------------------------------------  ## History Example  ## ----------------------------------------------------------------------- + +  def history_complete(messages):      print(messages)      reactor.stop() -pubnub.history( { -    'channel'  : crazy, -    'limit'    : 10, -    'callback' : history_complete +pubnub.history({ +    'channel': crazy, +    'limit': 10, +    'callback': history_complete  })  ## ----------------------------------------------------------------------- diff --git a/python-twisted/examples/publish-example.py b/python-twisted/examples/publish-example.py index d15b21b..6b5b19a 100644 --- a/python-twisted/examples/publish-example.py +++ b/python-twisted/examples/publish-example.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -15,54 +15,62 @@ sys.path.append('../')  sys.path.append('../../')  from Pubnub import Pubnub -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or ''     ##(Cipher key is Optional) -auth_key      = len(sys.argv) > 5 and sys.argv[5] or 'abcd'     ##(Cipher key is Optional) -ssl_on        = len(sys.argv) > 6 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len( +    sys.argv) > 4 and sys.argv[4] or ''  # (Cipher key is Optional) +auth_key = len( +    sys.argv) > 5 and sys.argv[5] or 'abcd'  # (Cipher key is Optional) +ssl_on = len(sys.argv) > 6 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## ----------------------------------------------------------------------- -pubnub = Pubnub( publish_key, subscribe_key, secret_key, cipher_key, auth_key, ssl_on ) -crazy  = 'hello_world' +pubnub = Pubnub( +    publish_key, subscribe_key, secret_key, cipher_key, auth_key, ssl_on) +crazy = 'hello_world'  ## -----------------------------------------------------------------------  ## Publish Example  ## ----------------------------------------------------------------------- + +  def publish_complete(info):      print(info) +  def publish_error(info): -    print('ERROR : ' +  str(info)) +    print('ERROR : ' + str(info))  ## Publish string  pubnub.publish({ -    'channel' : crazy, -    'message' : 'Hello World!', -    'callback' : publish_complete, -    'error' : publish_error +    'channel': crazy, +    'message': 'Hello World!', +    'callback': publish_complete, +    'error': publish_error  })  ## Publish list -li = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] +li = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', +      'Saturday']  pubnub.publish({ -    'channel' : crazy, -    'message' : li, -    'callback' : publish_complete, -    'error' : publish_error +    'channel': crazy, +    'message': li, +    'callback': publish_complete, +    'error': publish_error  }) +  def done_cb(info):      publish_complete(info)  pubnub.publish({ -    'channel' : crazy, -    'message' : { 'some_key' : 'some_val' }, -    'callback' : done_cb, -    'error' : publish_error +    'channel': crazy, +    'message': {'some_key': 'some_val'}, +    'callback': done_cb, +    'error': publish_error  }) diff --git a/python-twisted/examples/subscribe-example.py b/python-twisted/examples/subscribe-example.py index cf4a919..168a2d2 100644 --- a/python-twisted/examples/subscribe-example.py +++ b/python-twisted/examples/subscribe-example.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -14,32 +14,35 @@ from twisted.internet import reactor  sys.path.append('../')  from Pubnub import Pubnub -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or None -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len(sys.argv) > 4 and sys.argv[4] or None +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## -----------------------------------------------------------------------  #pubnub = Pubnub( publish_key, subscribe_key, secret_key, cipher_key, ssl_on ) -pubnub = Pubnub( publish_key, subscribe_key, secret_key, ssl_on ) -crazy  = 'hello_world' +pubnub = Pubnub(publish_key, subscribe_key, secret_key, ssl_on) +crazy = 'hello_world'  ## -----------------------------------------------------------------------  ## Subscribe Example  ## ----------------------------------------------------------------------- + +  def message_received(message):      print(message) -def connected() : + +def connected():      print 'Connected'  pubnub.subscribe({ -    'channel'  : crazy, -    'connect'  : connected, -    'callback' : message_received +    'channel': crazy, +    'connect': connected, +    'callback': message_received  })  ## ----------------------------------------------------------------------- diff --git a/python-twisted/examples/uuid-example.py b/python-twisted/examples/uuid-example.py index 94840e0..581051b 100644 --- a/python-twisted/examples/uuid-example.py +++ b/python-twisted/examples/uuid-example.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -17,7 +17,7 @@ from Pubnub import Pubnub  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## ----------------------------------------------------------------------- -pubnub = Pubnub( "", "", "", False ) +pubnub = Pubnub("", "", "", False)  ## -----------------------------------------------------------------------  ## UUID Example diff --git a/python-twisted/tests/delivery.py b/python-twisted/tests/delivery.py index dc6b9e2..3ba221b 100644 --- a/python-twisted/tests/delivery.py +++ b/python-twisted/tests/delivery.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -20,93 +20,100 @@ from Pubnub import Pubnub  ## -----------------------------------------------------------------------  ## Configuration  ## ----------------------------------------------------------------------- -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or 'demo' -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False -origin        = len(sys.argv) > 6 and sys.argv[6] or 'pubsub.pubnub.com' +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len(sys.argv) > 4 and sys.argv[4] or 'demo' +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False +origin = len(sys.argv) > 6 and sys.argv[6] or 'pubsub.pubnub.com'  origin = '184.72.9.220'  ## -----------------------------------------------------------------------  ## Analytics  ## -----------------------------------------------------------------------  analytics = { -    'publishes'            : 0,   ## Total Send Requests -    'received'             : 0,   ## Total Received Messages (Deliveries) -    'queued'               : 0,   ## Total Unreceived Queue (UnDeliveries) -    'successful_publishes' : 0,   ## Confirmed Successful Publish Request -    'failed_publishes'     : 0,   ## Confirmed UNSuccessful Publish Request -    'failed_deliveries'    : 0,   ## (successful_publishes - received) -    'deliverability'       : 0    ## Percentage Delivery +    'publishes': 0,  # Total Send Requests +    'received': 0,  # Total Received Messages (Deliveries) +    'queued': 0,  # Total Unreceived Queue (UnDeliveries) +    'successful_publishes': 0,  # Confirmed Successful Publish Request +    'failed_publishes': 0,  # Confirmed UNSuccessful Publish Request +    'failed_deliveries': 0,  # (successful_publishes - received) +    'deliverability': 0  # Percentage Delivery  }  trips = { -    'last'    : None, -    'current' : None, -    'max'     : 0, -    'avg'     : 0 +    'last': None, +    'current': None, +    'max': 0, +    'avg': 0  }  ## -----------------------------------------------------------------------  ## Initiat Class  ## -----------------------------------------------------------------------  channel = 'deliverability-' + str(time.time()) -pubnub  = Pubnub( +pubnub = Pubnub(      publish_key,      subscribe_key, -    secret_key = secret_key, -    cipher_key = cipher_key, -    ssl_on = ssl_on, -    origin = origin +    secret_key=secret_key, +    cipher_key=cipher_key, +    ssl_on=ssl_on, +    origin=origin  )  ## -----------------------------------------------------------------------  ## BENCHMARK  ## ----------------------------------------------------------------------- -def publish_sent(info = None): -    if info and info[0]: analytics['successful_publishes']   += 1 -    else:                analytics['failed_publishes']       += 1 + + +def publish_sent(info=None): +    if info and info[0]: +        analytics['successful_publishes'] += 1 +    else: +        analytics['failed_publishes'] += 1      analytics['publishes'] += 1 -    analytics['queued']    += 1 +    analytics['queued'] += 1 + +    pubnub.timeout(send, 0.1) -    pubnub.timeout( send, 0.1 )  def send():      if analytics['queued'] > 100:          analytics['queued'] -= 10 -        return pubnub.timeout( send, 10 ) +        return pubnub.timeout(send, 10)      pubnub.publish({ -        'channel'  : channel, -        'callback' : publish_sent, -        'message'  : "1234567890" +        'channel': channel, +        'callback': publish_sent, +        'message': "1234567890"      }) +  def received(message): -    analytics['queued']   -= 1 +    analytics['queued'] -= 1      analytics['received'] += 1      current_trip = trips['current'] = str(datetime.datetime.now())[0:19] -    last_trip    = trips['last']    = str( +    last_trip = trips['last'] = str(          datetime.datetime.now() - datetime.timedelta(seconds=1)      )[0:19]      ## New Trip Span (1 Second) -    if not trips.has_key(current_trip) : +    if current_trip not in trips:          trips[current_trip] = 0          ## Average -        if trips.has_key(last_trip): +        if last_trip in trips:              trips['avg'] = (trips['avg'] + trips[last_trip]) / 2      ## Increment Trip Counter      trips[current_trip] = trips[current_trip] + 1      ## Update Max -    if trips[current_trip] > trips['max'] : +    if trips[current_trip] > trips['max']:          trips['max'] = trips[current_trip] +  def show_status():      ## Update Failed Deliveries      analytics['failed_deliveries'] = \ @@ -115,45 +122,46 @@ def show_status():      ## Update Deliverability      analytics['deliverability'] = ( -        float(analytics['received']) / \ +        float(analytics['received']) /          float(analytics['successful_publishes'] or 1.0)      ) * 100.0      ## Print Display -    print( ( -       "max:%(max)03d/sec  "                  + \ -       "avg:%(avg)03d/sec  "                  + \ -       "pubs:%(publishes)05d  "               + \ -       "received:%(received)05d  "            + \ -       "spub:%(successful_publishes)05d  "    + \ -       "fpub:%(failed_publishes)05d  "        + \ -       "failed:%(failed_deliveries)05d  "     + \ -       "queued:%(queued)03d  "                + \ -       "delivery:%(deliverability)03f%%  "    + \ -       "" -    ) % { -        'max'                  : trips['max'], -        'avg'                  : trips['avg'], -        'publishes'            : analytics['publishes'], -        'received'             : analytics['received'], -        'successful_publishes' : analytics['successful_publishes'], -        'failed_publishes'     : analytics['failed_publishes'], -        'failed_deliveries'    : analytics['failed_deliveries'], -        'publishes'            : analytics['publishes'], -        'deliverability'       : analytics['deliverability'], -        'queued'               : analytics['queued'] -    } ) -    pubnub.timeout( show_status, 1 ) +    print(( +          "max:%(max)03d/sec  " + +          "avg:%(avg)03d/sec  " + +          "pubs:%(publishes)05d  " + +          "received:%(received)05d  " + +          "spub:%(successful_publishes)05d  " + +          "fpub:%(failed_publishes)05d  " + +          "failed:%(failed_deliveries)05d  " + +          "queued:%(queued)03d  " + +          "delivery:%(deliverability)03f%%  " + +          "" +          ) % { +          'max': trips['max'], +          'avg': trips['avg'], +          'publishes': analytics['publishes'], +          'received': analytics['received'], +          'successful_publishes': analytics['successful_publishes'], +          'failed_publishes': analytics['failed_publishes'], +          'failed_deliveries': analytics['failed_deliveries'], +          'publishes': analytics['publishes'], +          'deliverability': analytics['deliverability'], +          'queued': analytics['queued'] +          }) +    pubnub.timeout(show_status, 1) +  def connected():      show_status() -    pubnub.timeout( send, 1 ) +    pubnub.timeout(send, 1) -print( "Connected: %s\n" % origin ) +print("Connected: %s\n" % origin)  pubnub.subscribe({ -    'channel'  : channel, -    'connect'  : connected, -    'callback' : received +    'channel': channel, +    'connect': connected, +    'callback': received  })  ## ----------------------------------------------------------------------- diff --git a/python-twisted/tests/subscribe-test.py b/python-twisted/tests/subscribe-test.py index 0d4c65e..6ff4a35 100755 --- a/python-twisted/tests/subscribe-test.py +++ b/python-twisted/tests/subscribe-test.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -16,18 +16,18 @@ from Pubnub import Pubnub  from functools import partial  from threading import current_thread  import threading -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or None -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len(sys.argv) > 4 and sys.argv[4] or None +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## -----------------------------------------------------------------------  #pubnub = Pubnub( publish_key, subscribe_key, secret_key, cipher_key, ssl_on ) -pubnub = Pubnub( publish_key, subscribe_key, secret_key, ssl_on ) -crazy  = 'hello_world' +pubnub = Pubnub(publish_key, subscribe_key, secret_key, ssl_on) +crazy = 'hello_world'  current = -1 @@ -37,9 +37,12 @@ received = 0  ## -----------------------------------------------------------------------  ## Subscribe Example  ## ----------------------------------------------------------------------- + +  def message_received(message):      print message +  def check_received(message):      global current      global errors @@ -53,18 +56,19 @@ def check_received(message):      else:          received += 1      print 'active thread count : ', threading.activeCount() -    print 'errors = ' , errors +    print 'errors = ', errors      print current_thread().getName(), ' , ', 'received = ', received      if received != message: -        print '********** MISSED **************** ', message - received  +        print '********** MISSED **************** ', message - received      current = message -     -def connected_test(ch) : -    print 'Connected' , ch -def connected(ch) : +def connected_test(ch): +    print 'Connected', ch + + +def connected(ch):      pass @@ -75,57 +79,63 @@ pubnub.subscribe({      'callback' : message_received  })  ''' + +  def cb1(): -	pubnub.subscribe({ -	    'channel'  : 'efgh1', -	    'connect'  : connected, -	    'callback' : message_received -	}) +    pubnub.subscribe({ +        'channel': 'efgh1', +        'connect': connected, +        'callback': message_received +    }) +  def cb2(): -	pubnub.subscribe({ -	    'channel'  : 'dsm-test', -	    'connect'  : connected_test, -	    'callback' : check_received -	}) +    pubnub.subscribe({ +        'channel': 'dsm-test', +        'connect': connected_test, +        'callback': check_received +    }) +  def cb3(): -    pubnub.unsubscribe({'channel' : 'efgh1'}) +    pubnub.unsubscribe({'channel': 'efgh1'}) +  def cb4(): -    pubnub.unsubscribe({'channel' : 'abcd1'}) +    pubnub.unsubscribe({'channel': 'abcd1'}) +  def subscribe(channel): -	pubnub.subscribe({ -	    'channel'  : channel, -	    'connect'  : connected, -	    'callback' : message_received -	}) +    pubnub.subscribe({ +        'channel': channel, +        'connect': connected, +        'callback': message_received +    })  print threading.activeCount() -pubnub.timeout(15,cb1) +pubnub.timeout(15, cb1) -pubnub.timeout(30,cb2) +pubnub.timeout(30, cb2) -pubnub.timeout(45,cb3) +pubnub.timeout(45, cb3) -pubnub.timeout(60,cb4) +pubnub.timeout(60, cb4)  #''' -for x in range(1,1000): +for x in range(1, 1000):      #print x      def y(t):          subscribe('channel-' + str(t))      def z(t): -        pubnub.unsubscribe({'channel' : 'channel-' + str(t)}) +        pubnub.unsubscribe({'channel': 'channel-' + str(t)}) -    pubnub.timeout(x + 5, partial(y,x)) -    pubnub.timeout(x + 25, partial(z, x))  +    pubnub.timeout(x + 5, partial(y, x)) +    pubnub.timeout(x + 25, partial(z, x))      x += 10  #''' diff --git a/python-twisted/tests/unit-test-full.py b/python-twisted/tests/unit-test-full.py index c5940af..f8be1cc 100644 --- a/python-twisted/tests/unit-test-full.py +++ b/python-twisted/tests/unit-test-full.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -8,10 +8,10 @@  ## TODO Tests  ##  ## - wait 20 minutes, send a message, receive and success. -## -  -## -  -##  -##  +## - +## - +## +##  ## -----------------------------------  ## PubNub 3.1 Real-time Push Cloud API @@ -23,21 +23,21 @@ sys.path.append('./')  sys.path.append('../common/')  from Pubnub import Pubnub -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or None  -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or None -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or None +cipher_key = len(sys.argv) > 4 and sys.argv[4] or None +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Command Line Options Supplied PubNub  ## -----------------------------------------------------------------------  pubnub_user_supplied_options = Pubnub( -    publish_key,   ## OPTIONAL (supply None to disable) -    subscribe_key, ## REQUIRED -    secret_key,    ## OPTIONAL (supply None to disable) -    cipher_key,    ## OPTIONAL (supply None to disable) -    ssl_on         ## OPTIONAL (supply None to disable) +    publish_key,  # OPTIONAL (supply None to disable) +    subscribe_key,  # REQUIRED +    secret_key,  # OPTIONAL (supply None to disable) +    cipher_key,  # OPTIONAL (supply None to disable) +    ssl_on  # OPTIONAL (supply None to disable)  )  ## ----------------------------------------------------------------------- @@ -54,15 +54,15 @@ pubnub_high_security = Pubnub(      'sec-c-MTliNDE0NTAtYjY4Ni00MDRkLTllYTItNDhiZGE0N2JlYzBl',      ## Cipher Key -    'YWxzamRmbVjFaa05HVnGFqZHM3NXRBS73jxmhVMkjiwVVXV1d5UrXR1JLSkZFRr'+ -    'WVd4emFtUm1iR0TFpUZvbiBoYXMgYmVlbxWkhNaF3uUi8kM0YkJTEVlZYVFjBYi'+ -    'jFkWFIxSkxTa1pGUjd874hjklaTFpUwRVuIFNob3VsZCB5UwRkxUR1J6YVhlQWa'+ -    'V1ZkNGVH32mDkdho3pqtRnRVbTFpUjBaeGUgYXNrZWQtZFoKjda40ZWlyYWl1eX'+ -    'U4RkNtdmNub2l1dHE2TTA1jd84jkdJTbFJXYkZwWlZtRnKkWVrSRhhWbFpZVmFz'+ -    'c2RkZmTFpUpGa1dGSXhTa3hUYTFwR1Vpkm9yIGluZm9ybWFNfdsWQdSiiYXNWVX'+ -    'RSblJWYlRGcFVqQmFlRmRyYUU0MFpXbHlZV2wxZVhVNFJrTnR51YjJsMWRIRTJU'+ -    'W91ciBpbmZvcm1hdGliBzdWJtaXR0ZWQb3UZSBhIHJlc3BvbnNlLCB3ZWxsIHJl'+ -    'VEExWdHVybiB0am0aW9uIb24gYXMgd2UgcG9zc2libHkgY2FuLuhcFe24ldWVns'+ +    'YWxzamRmbVjFaa05HVnGFqZHM3NXRBS73jxmhVMkjiwVVXV1d5UrXR1JLSkZFRr' + +    'WVd4emFtUm1iR0TFpUZvbiBoYXMgYmVlbxWkhNaF3uUi8kM0YkJTEVlZYVFjBYi' + +    'jFkWFIxSkxTa1pGUjd874hjklaTFpUwRVuIFNob3VsZCB5UwRkxUR1J6YVhlQWa' + +    'V1ZkNGVH32mDkdho3pqtRnRVbTFpUjBaeGUgYXNrZWQtZFoKjda40ZWlyYWl1eX' + +    'U4RkNtdmNub2l1dHE2TTA1jd84jkdJTbFJXYkZwWlZtRnKkWVrSRhhWbFpZVmFz' + +    'c2RkZmTFpUpGa1dGSXhTa3hUYTFwR1Vpkm9yIGluZm9ybWFNfdsWQdSiiYXNWVX' + +    'RSblJWYlRGcFVqQmFlRmRyYUU0MFpXbHlZV2wxZVhVNFJrTnR51YjJsMWRIRTJU' + +    'W91ciBpbmZvcm1hdGliBzdWJtaXR0ZWQb3UZSBhIHJlc3BvbnNlLCB3ZWxsIHJl' + +    'VEExWdHVybiB0am0aW9uIb24gYXMgd2UgcG9zc2libHkgY2FuLuhcFe24ldWVns' +      'dSaTFpU3hVUjFKNllWaFdhRmxZUWpCaQo34gcmVxdWlGFzIHNveqQl83snBfVl3',      ## 2048bit SSL ON - ENABLED TRUE @@ -72,19 +72,24 @@ pubnub_high_security = Pubnub(  ## -----------------------------------------------------------------------  ## Channel | Message Test Data (UTF-8)  ## ----------------------------------------------------------------------- -crazy            = ' ~`â¦â§!@#$%^&*(顶顅Ȓ)+=[]\\{}|;\':",./<>?abcd' -many_channels    = [ str(x) + '-many_channel_test' for x in range(10) ] -runthroughs      = 0 -planned_tests    = 2 +crazy = ' ~`â¦â§!@#$%^&*(顶顅Ȓ)+=[]\\{}|;\':",./<>?abcd' +many_channels = [str(x) + '-many_channel_test' for x in range(10)] +runthroughs = 0 +planned_tests = 2  delivery_retries = 0 -max_retries      = 10 +max_retries = 10  ## -----------------------------------------------------------------------  ## Unit Test Function  ## ----------------------------------------------------------------------- -def test( trial, name ) : -    if trial : print( 'PASS: ' + name ) -    else :     print( '- FAIL - ' + name ) + + +def test(trial, name): +    if trial: +        print('PASS: ' + name) +    else: +        print('- FAIL - ' + name) +  def test_pubnub(pubnub):      global runthroughs, planned_tests, delivery_retries, max_retries @@ -94,36 +99,38 @@ def test_pubnub(pubnub):      ## -----------------------------------------------------------------------      def phase2():          status = { -            'sent'        : 0, -            'received'    : 0, -            'connections' : 0 +            'sent': 0, +            'received': 0, +            'connections': 0          } -        def received( message, chan ): +        def received(message, chan):              global runthroughs -            test( status['received'] <= status['sent'], 'many sends' ) +            test(status['received'] <= status['sent'], 'many sends')              status['received'] += 1 -            pubnub.unsubscribe({ 'channel' : chan }) +            pubnub.unsubscribe({'channel': chan})              if status['received'] == len(many_channels):                  runthroughs += 1 -                if runthroughs == planned_tests: pubnub.stop() +                if runthroughs == planned_tests: +                    pubnub.stop() -        def publish_complete( info, chan ): +        def publish_complete(info, chan):              global delivery_retries, max_retries              status['sent'] += 1 -            test( info, 'publish complete' ) -            test( info and len(info) > 2, 'publish response' ) +            test(info, 'publish complete') +            test(info and len(info) > 2, 'publish response')              if not info[0]:                  delivery_retries += 1 -                if max_retries > delivery_retries: sendit(chan) +                if max_retries > delivery_retries: +                    sendit(chan)          def sendit(chan):              tchan = chan              pubnub.publish({ -                'channel'  : chan, -                'message'  : "Hello World", -                'callback' : (lambda msg:publish_complete( msg, tchan )) +                'channel': chan, +                'message': "Hello World", +                'callback': (lambda msg: publish_complete(msg, tchan))              })          def connected(chan): @@ -131,88 +138,89 @@ def test_pubnub(pubnub):              sendit(chan)          def delivered(info): -            if info and info[0]: status['sent'] += 1 +            if info and info[0]: +                status['sent'] += 1          def subscribe(chan):              pubnub.subscribe({ -                'channel'  : chan, -                'connect'  : (lambda:connected(chan+'')), -                'callback' : (lambda msg:received( msg, chan )) +                'channel': chan, +                'connect': (lambda: connected(chan + '')), +                'callback': (lambda msg: received(msg, chan))              })          ## Subscribe All Channels -        for chan in many_channels: subscribe(chan) -         +        for chan in many_channels: +            subscribe(chan) +      ## -----------------------------------------------------------------------      ## Time Example      ## -----------------------------------------------------------------------      def time_complete(timetoken): -        test( timetoken, 'timetoken fetch' ) -        test( isinstance( timetoken, int ), 'timetoken int type' ) +        test(timetoken, 'timetoken fetch') +        test(isinstance(timetoken, int), 'timetoken int type') -    pubnub.time({ 'callback' : time_complete }) +    pubnub.time({'callback': time_complete})      ## -----------------------------------------------------------------------      ## Publish Example      ## -----------------------------------------------------------------------      def publish_complete(info): -        test( info, 'publish complete' ) -        test( info and len(info) > 2, 'publish response' ) +        test(info, 'publish complete') +        test(info and len(info) > 2, 'publish response') -        pubnub.history( { -            'channel'  : crazy, -            'limit'    : 10, -            'callback' : history_complete +        pubnub.history({ +            'channel': crazy, +            'limit': 10, +            'callback': history_complete          })      ## -----------------------------------------------------------------------      ## History Example      ## -----------------------------------------------------------------------      def history_complete(messages): -        test( messages and len(messages) > 0, 'history' ) -        test( messages, 'history' ) - +        test(messages and len(messages) > 0, 'history') +        test(messages, 'history')      pubnub.publish({ -        'channel'  : crazy, -        'message'  : "Hello World", -        'callback' : publish_complete +        'channel': crazy, +        'message': "Hello World", +        'callback': publish_complete      })      ## -----------------------------------------------------------------------      ## Subscribe Example      ## -----------------------------------------------------------------------      def message_received(message): -        test( message, 'message received' ) -        pubnub.unsubscribe({ 'channel' : crazy }) +        test(message, 'message received') +        pubnub.unsubscribe({'channel': crazy}) -        def done() : -            pubnub.unsubscribe({ 'channel' : crazy }) +        def done(): +            pubnub.unsubscribe({'channel': crazy})              pubnub.publish({ -                'channel'  : crazy, -                'message'  : "Hello World", -                'callback' : (lambda x:x) +                'channel': crazy, +                'message': "Hello World", +                'callback': (lambda x: x)              }) -        def dumpster(message) : -            test( 0, 'never see this' ) +        def dumpster(message): +            test(0, 'never see this')          pubnub.subscribe({ -            'channel'  : crazy, -            'connect'  : done, -            'callback' : dumpster +            'channel': crazy, +            'connect': done, +            'callback': dumpster          }) -    def connected() : +    def connected():          pubnub.publish({ -            'channel' : crazy, -            'message' : { 'Info' : 'Connected!' } +            'channel': crazy, +            'message': {'Info': 'Connected!'}          })      pubnub.subscribe({ -        'channel'  : crazy, -        'connect'  : connected, -        'callback' : message_received +        'channel': crazy, +        'connect': connected, +        'callback': message_received      })      phase2() @@ -223,4 +231,3 @@ def test_pubnub(pubnub):  test_pubnub(pubnub_user_supplied_options)  test_pubnub(pubnub_high_security)  pubnub_high_security.start() - diff --git a/python-twisted/tests/unit-tests.py b/python-twisted/tests/unit-tests.py index f143a3a..d0e5722 100644 --- a/python-twisted/tests/unit-tests.py +++ b/python-twisted/tests/unit-tests.py @@ -10,98 +10,102 @@ sys.path.append('.')  from PubnubUnitTest import Suite  from Pubnub import Pubnub -pubnub = Pubnub("demo","demo") +pubnub = Pubnub("demo", "demo")  tests_count = 1 + 2 + 1 -test_suite = Suite(pubnub,tests_count) +test_suite = Suite(pubnub, tests_count)  tests = [] -  def test_publish(): -	channel =  "hello" + str(time.time()) -	name = "Publish Test" -	def success(r): -		test_suite.test(r[0] == 1, name) +    channel = "hello" + str(time.time()) +    name = "Publish Test" -	def fail(e): -		test_suite.test(False, msg , e) +    def success(r): +        test_suite.test(r[0] == 1, name) +    def fail(e): +        test_suite.test(False, msg, e) -	pubnub.publish({ -		'channel' : 'hello', -		'message' : 'hi', -		'callback' : success, -		'error' : fail -	}) +    pubnub.publish({ +                   'channel': 'hello', +                   'message': 'hi', +                   'callback': success, +                   'error': fail +                   })  tests.append(test_publish)  #""" + +  def test_subscribe_publish(): -	channel = "hello" + str(time.time()) -	name = "Subscribe Publish Test" -	publish_msg = "This is Pubnub Python-Twisted" -	def connect(): -		#print 'connect' -		def success(r): -			test_suite.test(r[0] == 1, name, "publish success") - -		def fail(e): -			test_suite.test(False, name , "Publish Failed", e) - -		pubnub.publish({ -			'channel' : channel, -			'message' : publish_msg, -			'callback' : success, -			'error' : fail -		}) - -	def callback(r): -		test_suite.test(r == publish_msg, name, "message received") - -	pubnub.subscribe({ -		'channel' : channel, -		'callback' : callback, -		'connect' : connect -	}) +    channel = "hello" + str(time.time()) +    name = "Subscribe Publish Test" +    publish_msg = "This is Pubnub Python-Twisted" + +    def connect(): +        #print 'connect' +        def success(r): +            test_suite.test(r[0] == 1, name, "publish success") + +        def fail(e): +            test_suite.test(False, name, "Publish Failed", e) + +        pubnub.publish({ +                       'channel': channel, +                       'message': publish_msg, +                       'callback': success, +                       'error': fail +                       }) + +    def callback(r): +        test_suite.test(r == publish_msg, name, "message received") + +    pubnub.subscribe({ +                     'channel': channel, +                     'callback': callback, +                     'connect': connect +                     })  tests.append(test_subscribe_publish)  #""" +  def test_here_now(): -	channel = "hello12" #+ str(time.time()) -	name = "Here Now Test" - -	def connect(): -		print 'connect' -		def call_here_now(): -			print 'call_here_now' -			def success(r): -				test_suite.test(r['occupancy'] == 1, name, "Here Now success") - -			def fail(e): -				test_suite.test(False, name , "Here Now Failed", e) - -			pubnub.here_now({ -				'channel' : channel, -				'callback' : success, -				'error' : fail -			}) -		pubnub.timeout(5, call_here_now) - -	def callback(r): -		pass -	print 'Subscribe' -	pubnub.subscribe({ -		'channel' : channel, -		'callback' : callback, -		'connect' : connect -	}) +    channel = "hello12"  # + str(time.time()) +    name = "Here Now Test" + +    def connect(): +        print 'connect' + +        def call_here_now(): +            print 'call_here_now' + +            def success(r): +                test_suite.test(r['occupancy'] == 1, name, "Here Now success") + +            def fail(e): +                test_suite.test(False, name, "Here Now Failed", e) + +            pubnub.here_now({ +                            'channel': channel, +                            'callback': success, +                            'error': fail +                            }) +        pubnub.timeout(5, call_here_now) + +    def callback(r): +        pass +    print 'Subscribe' +    pubnub.subscribe({ +                     'channel': channel, +                     'callback': callback, +                     'connect': connect +                     })  tests.append(test_here_now) - - -for t in tests: t() +for t in tests: +    t()  pubnub.start() diff --git a/python-twisted/unassembled/Platform.py b/python-twisted/unassembled/Platform.py index c7fe5cd..d6d91ac 100644 --- a/python-twisted/unassembled/Platform.py +++ b/python-twisted/unassembled/Platform.py @@ -2,7 +2,8 @@ from twisted.web.client import getPage  from twisted.internet import reactor  from twisted.internet.defer import Deferred  from twisted.internet.protocol import Protocol -from twisted.web.client import Agent, ContentDecoderAgent, RedirectAgent, GzipDecoder +from twisted.web.client import Agent, ContentDecoderAgent +from twisted.web.client import RedirectAgent, GzipDecoder  from twisted.web.client import HTTPConnectionPool  from twisted.web.http_headers import Headers  from twisted.internet.ssl import ClientContextFactory @@ -15,16 +16,21 @@ from twisted.python.compat import (      _PY3, unicode, intToBytes, networkString, nativeString)  pnconn_pool = HTTPConnectionPool(reactor, persistent=True) -pnconn_pool.maxPersistentPerHost    = 100000 +pnconn_pool.maxPersistentPerHost = 100000  pnconn_pool.cachedConnectionTimeout = 310  pnconn_pool.retryAutomatically = True +  class Pubnub(PubnubCoreAsync): -    def start(self): reactor.run() -    def stop(self):  reactor.stop() -    def timeout( self, delay, callback ): -        reactor.callLater( delay, callback ) +    def start(self): +        reactor.run() + +    def stop(self): +        reactor.stop() + +    def timeout(self, delay, callback): +        reactor.callLater(delay, callback)      def __init__(          self, @@ -33,9 +39,9 @@ class Pubnub(PubnubCoreAsync):          secret_key=False,          cipher_key=False,          auth_key=None, -        ssl_on = False, -        origin = 'pubsub.pubnub.com' -    ) : +        ssl_on=False, +        origin='pubsub.pubnub.com' +    ):          super(Pubnub, self).__init__(              publish_key=publish_key,              subscribe_key=subscribe_key, @@ -44,13 +50,13 @@ class Pubnub(PubnubCoreAsync):              auth_key=auth_key,              ssl_on=ssl_on,              origin=origin, -        )         +        )          self.headers = {}          self.headers['User-Agent'] = ['Python-Twisted']          #self.headers['Accept-Encoding'] = [self.accept_encoding]          self.headers['V'] = [self.version] -    def _request( self, request, callback=None, error=None, single=False ) : +    def _request(self, request, callback=None, error=None, single=False):          global pnconn_pool          def _invoke(func, data): @@ -67,18 +73,19 @@ class Pubnub(PubnubCoreAsync):          '''          url = self.getUrl(request) -        agent       = ContentDecoderAgent(RedirectAgent(Agent( +        agent = ContentDecoderAgent(RedirectAgent(Agent(              reactor, -            contextFactory = WebClientContextFactory(), -            pool = self.ssl and None or pnconn_pool +            contextFactory=WebClientContextFactory(), +            pool=self.ssl and None or pnconn_pool          )), [('gzip', GzipDecoder)])          try: -            request     = agent.request( 'GET', url, Headers(self.headers), None ) +            request = agent.request( +                'GET', url, Headers(self.headers), None)          except TypeError as te:              print(url.encode()) -            request     = agent.request( 'GET', url.encode(), Headers(self.headers), None ) - +            request = agent.request( +                'GET', url.encode(), Headers(self.headers), None)          if single is True:              id = time.time() @@ -112,7 +119,7 @@ class Pubnub(PubnubCoreAsync):                  try:                      data = json.loads(data.decode("utf-8"))                  except: -                    _invoke(error, {'error' : 'json decode error'}) +                    _invoke(error, {'error': 'json decode error'})              if 'error' in data and 'status' in data and 'status' != 200:                  _invoke(error, data) @@ -128,23 +135,25 @@ class Pubnub(PubnubCoreAsync):          return abort +  class WebClientContextFactory(ClientContextFactory):      def getContext(self, hostname, port):          return ClientContextFactory.getContext(self) +  class PubNub403Response(Protocol): -    def __init__( self, finished ): +    def __init__(self, finished):          self.finished = finished -    def dataReceived( self, bytes ): +    def dataReceived(self, bytes):          #print '403 resp ', bytes          self.finished.callback(bytes) -	    + +  class PubNubResponse(Protocol): -    def __init__( self, finished ): +    def __init__(self, finished):          self.finished = finished -    def dataReceived( self, bytes ): +    def dataReceived(self, bytes):          #print bytes          self.finished.callback(bytes) - diff --git a/python/Pubnub.py b/python/Pubnub.py index 230915c..93f416b 100644 --- a/python/Pubnub.py +++ b/python/Pubnub.py @@ -12,11 +12,12 @@  from Crypto.Cipher import AES  from Crypto.Hash import MD5 -from base64 import encodestring, decodestring  +from base64 import encodestring, decodestring  import hashlib  import hmac -class PubnubCrypto2() : + +class PubnubCrypto2():      """      #**      #* PubnubCrypto @@ -27,8 +28,8 @@ class PubnubCrypto2() :      pc = PubnubCrypto      """ -    -    def pad( self, msg, block_size=16 ): + +    def pad(self, msg, block_size=16):          """          #**          #* pad @@ -40,9 +41,9 @@ class PubnubCrypto2() :          #**          """          padding = block_size - (len(msg) % block_size) -        return msg + chr(padding)*padding -        -    def depad( self, msg ): +        return msg + chr(padding) * padding + +    def depad(self, msg):          """          #**          #* depad @@ -53,7 +54,7 @@ class PubnubCrypto2() :          """          return msg[0:-ord(msg[-1])] -    def getSecret( self, key ): +    def getSecret(self, key):          """          #**          #* getSecret @@ -64,7 +65,7 @@ class PubnubCrypto2() :          """          return hashlib.sha256(key).hexdigest() -    def encrypt( self, key, msg ): +    def encrypt(self, key, msg):          """          #**          #* encrypt @@ -74,11 +75,12 @@ class PubnubCrypto2() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes)          enc = encodestring(cipher.encrypt(self.pad(msg)))          return enc -    def decrypt( self, key, msg ): + +    def decrypt(self, key, msg):          """          #**          #* decrypt @@ -88,12 +90,12 @@ class PubnubCrypto2() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes)          return self.depad((cipher.decrypt(decodestring(msg)))) -class PubnubCrypto3() : +class PubnubCrypto3():      """      #**      #* PubnubCrypto @@ -104,8 +106,8 @@ class PubnubCrypto3() :      pc = PubnubCrypto      """ -    -    def pad( self, msg, block_size=16 ): + +    def pad(self, msg, block_size=16):          """          #**          #* pad @@ -117,9 +119,9 @@ class PubnubCrypto3() :          #**          """          padding = block_size - (len(msg) % block_size) -        return msg + (chr(padding)*padding).encode('utf-8') -        -    def depad( self, msg ): +        return msg + (chr(padding) * padding).encode('utf-8') + +    def depad(self, msg):          """          #**          #* depad @@ -130,7 +132,7 @@ class PubnubCrypto3() :          """          return msg[0:-ord(msg[-1])] -    def getSecret( self, key ): +    def getSecret(self, key):          """          #**          #* getSecret @@ -141,7 +143,7 @@ class PubnubCrypto3() :          """          return hashlib.sha256(key.encode("utf-8")).hexdigest() -    def encrypt( self, key, msg ): +    def encrypt(self, key, msg):          """          #**          #* encrypt @@ -151,10 +153,12 @@ class PubnubCrypto3() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) -        return encodestring(cipher.encrypt(self.pad(msg.encode('utf-8')))).decode('utf-8') -    def decrypt( self, key, msg ): +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes) +        return encodestring( +            cipher.encrypt(self.pad(msg.encode('utf-8')))).decode('utf-8') + +    def decrypt(self, key, msg):          """          #**          #* decrypt @@ -164,40 +168,46 @@ class PubnubCrypto3() :          #**          """          secret = self.getSecret(key) -        Initial16bytes='0123456789012345' -        cipher = AES.new(secret[0:32],AES.MODE_CBC,Initial16bytes) -        return (cipher.decrypt(decodestring(msg.encode('utf-8')))).decode('utf-8') +        Initial16bytes = '0123456789012345' +        cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes) +        return (cipher.decrypt( +            decodestring(msg.encode('utf-8')))).decode('utf-8') -try: import json -except ImportError: import simplejson as json +try: +    import json +except ImportError: +    import simplejson as json  import time  import hashlib  import uuid  import sys -try: from urllib.parse  import quote -except: from urllib2 import quote +try: +    from urllib.parse import quote +except: +    from urllib2 import quote -from base64  import urlsafe_b64encode +from base64 import urlsafe_b64encode  from hashlib import sha256  import hmac +  class PubnubBase(object):      def __init__(          self,          publish_key,          subscribe_key, -        secret_key = False, -        cipher_key = False, -        auth_key = None, -        ssl_on = False, -        origin = 'pubsub.pubnub.com', -        UUID = None -    ) : +        secret_key=False, +        cipher_key=False, +        auth_key=None, +        ssl_on=False, +        origin='pubsub.pubnub.com', +        UUID=None +    ):          """          #**          #* Pubnub @@ -209,41 +219,41 @@ class PubnubBase(object):          #* @param string secret_key optional key to sign messages.          #* @param boolean ssl required for 2048 bit encrypted messages.          #* @param string origin PUBNUB Server Origin. -        #* @param string pres_uuid optional identifier for presence (auto-generated if not supplied) +        #* @param string pres_uuid optional identifier +        #*    for presence (auto-generated if not supplied)          #**          ## Initiat Class          pubnub = Pubnub( 'PUBLISH-KEY', 'SUBSCRIBE-KEY', 'SECRET-KEY', False )          """ -        self.origin        = origin -        self.limit         = 1800 -        self.publish_key   = publish_key +        self.origin = origin +        self.limit = 1800 +        self.publish_key = publish_key          self.subscribe_key = subscribe_key -        self.secret_key    = secret_key -        self.cipher_key    = cipher_key -        self.ssl           = ssl_on -        self.auth_key      = auth_key +        self.secret_key = secret_key +        self.cipher_key = cipher_key +        self.ssl = ssl_on +        self.auth_key = auth_key - -        if self.ssl : +        if self.ssl:              self.origin = 'https://' + self.origin -        else : -            self.origin = 'http://'  + self.origin -         +        else: +            self.origin = 'http://' + self.origin +          self.uuid = UUID or str(uuid.uuid4())          if type(sys.version_info) is tuple: -            self.python_version  = 2 -            self.pc              = PubnubCrypto2() +            self.python_version = 2 +            self.pc = PubnubCrypto2()          else:              if sys.version_info.major == 2: -                self.python_version  = 2 -                self.pc              = PubnubCrypto2() +                self.python_version = 2 +                self.pc = PubnubCrypto2()              else:                  self.python_version = 3 -                self.pc             = PubnubCrypto3() -         +                self.pc = PubnubCrypto3() +          if not isinstance(self.uuid, str):              raise AttributeError("pres_uuid must be a string") @@ -264,7 +274,7 @@ class PubnubBase(object):          return signature      ''' -    def _pam_sign( self, msg ): +    def _pam_sign(self, msg):          """Calculate a signature by secret key and message."""          return urlsafe_b64encode(hmac.new( @@ -273,7 +283,7 @@ class PubnubBase(object):              sha256          ).digest()) -    def _pam_auth( self, query , apicode=0, callback=None): +    def _pam_auth(self, query, apicode=0, callback=None):          """Issue an authenticated request."""          if 'timestamp' not in query: @@ -300,57 +310,50 @@ class PubnubBase(object):          query['signature'] = self._pam_sign(sign_input) -        ''' -        url = ("https://pubsub.pubnub.com/v1/auth/{apitype}/sub-key/".format(apitype="audit" if (apicode) else "grant") + -            self.subscribe_key + "?" + -            params + "&signature=" + -            quote(signature, safe="")) -        ''' -          return self._request({"urlcomponents": [ -            'v1', 'auth', "audit" if (apicode) else "grant" ,  +            'v1', 'auth', "audit" if (apicode) else "grant",              'sub-key',              self.subscribe_key -        ], 'urlparams' : query},  -        self._return_wrapped_callback(callback)) +        ], 'urlparams': query}, +            self._return_wrapped_callback(callback)) -    def grant( self, channel, authkey=False, read=True, write=True, ttl=5, callback=None): +    def grant(self, channel, authkey=False, read=True, +              write=True, ttl=5, callback=None):          """Grant Access on a Channel."""          return self._pam_auth({ -            "channel" : channel, -            "auth"    : authkey, -            "r"       : read  and 1 or 0, -            "w"       : write and 1 or 0, -            "ttl"     : ttl +            "channel": channel, +            "auth": authkey, +            "r": read and 1 or 0, +            "w": write and 1 or 0, +            "ttl": ttl          }, callback=callback) -    def revoke( self, channel, authkey=False, ttl=1, callback=None): +    def revoke(self, channel, authkey=False, ttl=1, callback=None):          """Revoke Access on a Channel."""          return self._pam_auth({ -            "channel" : channel, -            "auth"    : authkey, -            "r"       : 0, -            "w"       : 0, -            "ttl"     : ttl +            "channel": channel, +            "auth": authkey, +            "r": 0, +            "w": 0, +            "ttl": ttl          }, callback=callback)      def audit(self, channel=False, authkey=False, callback=None):          return self._pam_auth({ -            "channel" : channel, -            "auth"    : authkey -        },1, callback=callback) -             - +            "channel": channel, +            "auth": authkey +        }, 1, callback=callback)      def encrypt(self, message):          if self.cipher_key: -            message = json.dumps(self.pc.encrypt(self.cipher_key, json.dumps(message)).replace('\n','')) -        else : +            message = json.dumps(self.pc.encrypt( +                self.cipher_key, json.dumps(message)).replace('\n', '')) +        else:              message = json.dumps(message) -        return message; +        return message      def decrypt(self, message):          if self.cipher_key: @@ -361,15 +364,17 @@ class PubnubBase(object):      def _return_wrapped_callback(self, callback=None):          def _new_format_callback(response):              if 'payload' in response: -                if (callback != None): callback({'message' : response['message'], 'payload' : response['payload']}) +                if (callback is not None): +                    callback({'message': response['message'], +                              'payload': response['payload']})              else: -                if (callback != None):callback(response) -        if (callback != None): +                if (callback is not None): +                    callback(response) +        if (callback is not None):              return _new_format_callback          else:              return None -      def publish(channel, message, callback=None, error=None):          """          #** @@ -403,10 +408,11 @@ class PubnubBase(object):              channel,              '0',              message -        ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback),  -        error=self._return_wrapped_callback(error)) -     -    def presence( self, channel, callback, error=None) : +        ], 'urlparams': {'auth': self.auth_key}}, +            callback=self._return_wrapped_callback(callback), +            error=self._return_wrapped_callback(error)) + +    def presence(self, channel, callback, error=None):          """          #**          #* presence @@ -425,13 +431,15 @@ class PubnubBase(object):          pubnub.presence({              'channel'  : 'hello_world', -            'callback' : receive  +            'callback' : receive          })          """ -        return self.subscribe({'channel': channel+'-pnpres', 'subscribe_key':self.subscribe_key, 'callback': self._return_wrapped_callback(callback)}) -     -     -    def here_now( self, channel, callback, error=None) : +        return self.subscribe({ +            'channel': channel + '-pnpres', +            'subscribe_key': self.subscribe_key, +            'callback': self._return_wrapped_callback(callback)}) + +    def here_now(self, channel, callback, error=None):          """          #**          #* Here Now @@ -452,33 +460,31 @@ class PubnubBase(object):          """          channel = str(args['channel']) - -        callback    = args['callback']  if 'callback'  in args else None -        error       = args['error']     if 'error'     in args else None +        callback = args['callback'] if 'callback' in args else None +        error = args['error'] if 'error' in args else None          ## Fail if bad input. -        if not channel : +        if not channel:              raise Exception('Missing Channel')              return False -         +          ## Get Presence Here Now          return self._request({"urlcomponents": [ -            'v2','presence', +            'v2', 'presence',              'sub_key', self.subscribe_key,              'channel', channel -        ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback),  -        error=self._return_wrapped_callback(error)) +        ], 'urlparams': {'auth': self.auth_key}}, +            callback=self._return_wrapped_callback(callback), +            error=self._return_wrapped_callback(error)) -    def history(self, channel, count=100, reverse=False, start=None, end=None, callback=None, error=None) : +    def history(self, channel, count=100, reverse=False, +                start=None, end=None, callback=None, error=None):          """          #**          #* History          #*          #* Load history from a channel.          #* -        #* @param array args with 'channel', optional: 'start', 'end', 'reverse', 'count' -        #* @return mixed false on fail, array on success. -        #*          ## History Example          history = pubnub.detailedHistory({ @@ -489,25 +495,26 @@ class PubnubBase(object):          """ -        params = dict()  +        params = dict() -        params['count']     = count -        params['reverse']   = reverse -        params['start']     = start -        params['end']       = end +        params['count'] = count +        params['reverse'] = reverse +        params['start'] = start +        params['end'] = end          ## Get History -        return self._request({ 'urlcomponents' : [ +        return self._request({'urlcomponents': [              'v2',              'history',              'sub-key',              self.subscribe_key,              'channel',              channel, -        ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback),  -        error=self._return_wrapped_callback(error)) +        ], 'urlparams': {'auth': self.auth_key}}, +            callback=self._return_wrapped_callback(callback), +            error=self._return_wrapped_callback(error)) -    def time(self,callback=None) : +    def time(self, callback=None):          """          #**          #* Time @@ -523,30 +530,30 @@ class PubnubBase(object):          """ -        time = self._request({'urlcomponents' : [ +        time = self._request({'urlcomponents': [              'time',              '0'          ]}, callback) -        if time != None: +        if time is not None:              return time[0] - -    def _encode( self, request ) : +    def _encode(self, request):          return [ -            "".join([ ' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and -                hex(ord(ch)).replace( '0x', '%' ).upper() or -                ch for ch in list(bit) -            ]) for bit in request] -     -    def getUrl(self,request): +            "".join([' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and +                     hex(ord(ch)).replace('0x', '%').upper() or +                     ch for ch in list(bit) +                     ]) for bit in request] + +    def getUrl(self, request):          ## Build URL          url = self.origin + '/' + "/".join([ -            "".join([ ' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and -                hex(ord(ch)).replace( '0x', '%' ).upper() or -                ch for ch in list(bit) -            ]) for bit in request["urlcomponents"]]) +            "".join([' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and +                     hex(ord(ch)).replace('0x', '%').upper() or +                     ch for ch in list(bit) +                     ]) for bit in request["urlcomponents"]])          if ("urlparams" in request): -            url = url + '?' + "&".join([ x + "=" + str(y)  for x,y in request["urlparams"].items() if y is not None]) +            url = url + '?' + "&".join([x + "=" + str(y) for x, y in request[ +                "urlparams"].items() if y is not None])          return url @@ -558,32 +565,38 @@ except ImportError:      sha256 = digestmod.new  import hmac +  class EmptyLock():      def __enter__(self):          pass -    def __exit__(self,a,b,c): + +    def __exit__(self, a, b, c):          pass  empty_lock = EmptyLock() +  class PubnubCoreAsync(PubnubBase): -    def start(self): pass  -    def stop(self):  pass +    def start(self): +        pass + +    def stop(self): +        pass      def __init__(          self,          publish_key,          subscribe_key, -        secret_key = False, -        cipher_key = False, -        auth_key = None, -        ssl_on = False, -        origin = 'pubsub.pubnub.com', -        uuid = None, +        secret_key=False, +        cipher_key=False, +        auth_key=None, +        ssl_on=False, +        origin='pubsub.pubnub.com', +        uuid=None,          _tt_lock=empty_lock,          _channel_list_lock=empty_lock -    ) : +    ):          """          #**          #* Pubnub @@ -610,18 +623,18 @@ class PubnubCoreAsync(PubnubBase):              ssl_on=ssl_on,              origin=origin,              UUID=uuid -        )         - -        self.subscriptions              = {} -        self.timetoken                  = 0 -        self.last_timetoken             = 0 -        self.version                    = '3.3.4' -        self.accept_encoding            = 'gzip' -        self.SUB_RECEIVER               = None -        self._connect                   = None -        self._tt_lock                   = _tt_lock -        self._channel_list_lock         = _channel_list_lock -        self._connect                   = lambda: None +        ) + +        self.subscriptions = {} +        self.timetoken = 0 +        self.last_timetoken = 0 +        self.version = '3.3.4' +        self.accept_encoding = 'gzip' +        self.SUB_RECEIVER = None +        self._connect = None +        self._tt_lock = _tt_lock +        self._channel_list_lock = _channel_list_lock +        self._connect = lambda: None      def get_channel_list(self, channels):          channel = '' @@ -653,7 +666,8 @@ class PubnubCoreAsync(PubnubBase):          for i in l:              func(i) -    def subscribe( self, channel, callback, error=None, connect=None, disconnect=None, reconnect=None, sync=False ) : +    def subscribe(self, channel, callback, error=None, +                  connect=None, disconnect=None, reconnect=None, sync=False):          """          #**          #* Subscribe @@ -687,14 +701,15 @@ class PubnubCoreAsync(PubnubBase):          """          with self._tt_lock: -            self.last_timetoken = self.timetoken if self.timetoken != 0 else self.last_timetoken +            self.last_timetoken = self.timetoken if self.timetoken != 0 \ +                else self.last_timetoken              self.timetoken = 0          if sync is True and self.susbcribe_sync is not None:              self.susbcribe_sync(args)              return -        def _invoke(func,msg=None): +        def _invoke(func, msg=None):              if func is not None:                  if msg is not None:                      func(msg) @@ -708,17 +723,17 @@ class PubnubCoreAsync(PubnubBase):                          chobj = self.subscriptions[ch]                          if chobj['connected'] is False:                              chobj['connected'] = True -                            _invoke(chobj['connect'],chobj['name']) +                            _invoke(chobj['connect'], chobj['name'])          def _invoke_error(channel_list=None, err=None):              if channel_list is None:                  for ch in self.subscriptions:                      chobj = self.subscriptions[ch] -                    _invoke(chobj['error'],err) +                    _invoke(chobj['error'], err)              else:                  for ch in channel_list:                      chobj = self.subscriptions[ch] -                    _invoke(chobj['error'],err) +                    _invoke(chobj['error'], err)          def _get_channel():              for ch in self.subscriptions: @@ -726,53 +741,58 @@ class PubnubCoreAsync(PubnubBase):                  if chobj['subscribed'] is True:                      return chobj -          ## New Channel? -        if not channel in self.subscriptions or self.subscriptions[channel]['subscribed'] is False: -            with self._channel_list_lock: -                self.subscriptions[channel] = { -                    'name'          : channel, -                    'first'         : False, -                    'connected'     : False, -                    'subscribed'    : True, -                    'callback'      : callback, -                    'connect'       : connect, -                    'disconnect'    : disconnect, -                    'reconnect'     : reconnect, -                    'error'         : error -                } - +        if not channel in self.subscriptions or \ +                self.subscriptions[channel]['subscribed'] is False: +                with self._channel_list_lock: +                    self.subscriptions[channel] = { +                        'name': channel, +                        'first': False, +                        'connected': False, +                        'subscribed': True, +                        'callback': callback, +                        'connect': connect, +                        'disconnect': disconnect, +                        'reconnect': reconnect, +                        'error': error +                    }          ## return if already connected to channel -        if channel in self.subscriptions and 'connected' in self.subscriptions[channel] and self.subscriptions[channel]['connected'] is True: -            _invoke(error, "Already Connected") -            return -             -             +        if channel in self.subscriptions and \ +            'connected' in self.subscriptions[channel] and \ +                self.subscriptions[channel]['connected'] is True: +                    _invoke(error, "Already Connected") +                    return -        ## SUBSCRIPTION RECURSION  +        ## SUBSCRIPTION RECURSION          def _connect(): -           +              self._reset_offline()              def sub_callback(response):                  ## ERROR ? -                if not response or ('message' in response and response['message'] == 'Forbidden'): -                    _invoke_error(response['payload']['channels'], response['message']) -                    _connect() -                    return +                if not response or \ +                    ('message' in response and +                        response['message'] == 'Forbidden'): +                            _invoke_error(response['payload'][ +                                'channels'], response['message']) +                            _connect() +                            return                  _invoke_connect()                  with self._tt_lock: -                    self.timetoken = self.last_timetoken if self.timetoken == 0 and self.last_timetoken != 0 else response[1] +                    self.timetoken = \ +                        self.last_timetoken if self.timetoken == 0 and \ +                        self.last_timetoken != 0 else response[1]                      if len(response) > 2:                          channel_list = response[2].split(',')                          response_list = response[0]                          for ch in enumerate(channel_list):                              if ch[1] in self.subscriptions:                                  chobj = self.subscriptions[ch[1]] -                                _invoke(chobj['callback'],self.decrypt(response_list[ch[0]])) +                                _invoke(chobj['callback'], +                                        self.decrypt(response_list[ch[0]]))                      else:                          response_list = response[0]                          chobj = _get_channel() @@ -782,23 +802,25 @@ class PubnubCoreAsync(PubnubBase):                      _connect() -              channel_list = self.get_channel_list(self.subscriptions)              if len(channel_list) <= 0:                  return              ## CONNECT TO PUBNUB SUBSCRIBE SERVERS              try: -                self.SUB_RECEIVER = self._request( { "urlcomponents" : [ +                self.SUB_RECEIVER = self._request({"urlcomponents": [                      'subscribe',                      self.subscribe_key,                      channel_list,                      '0',                      str(self.timetoken) -                ], "urlparams" : {"uuid":self.uuid, "auth" : self.auth_key} }, sub_callback, sub_callback, single=True ) +                ], "urlparams": {"uuid": self.uuid, "auth": self.auth_key}}, +                    sub_callback, +                    sub_callback, +                    single=True)              except Exception as e:                  print(e) -                self.timeout( 1, _connect) +                self.timeout(1, _connect)                  return          self._connect = _connect @@ -815,8 +837,7 @@ class PubnubCoreAsync(PubnubBase):          self._reset_offline()          self._connect() - -    def unsubscribe( self, channel ): +    def unsubscribe(self, channel):          if channel in self.subscriptions is False:              return False @@ -824,10 +845,10 @@ class PubnubCoreAsync(PubnubBase):          ## DISCONNECT          with self._channel_list_lock:              if channel in self.subscriptions: -                self.subscriptions[channel]['connected']    = 0 -                self.subscriptions[channel]['subscribed']   = False -                self.subscriptions[channel]['timetoken']    = 0 -                self.subscriptions[channel]['first']        = False +                self.subscriptions[channel]['connected'] = 0 +                self.subscriptions[channel]['subscribed'] = False +                self.subscriptions[channel]['timetoken'] = 0 +                self.subscriptions[channel]['first'] = False          self.CONNECT() @@ -843,13 +864,12 @@ import threading  from threading import current_thread  latest_sub_callback_lock = threading.RLock() -latest_sub_callback = {'id' : None, 'callback' : None} - - +latest_sub_callback = {'id': None, 'callback': None}  class HTTPClient: -    def __init__(self, url, urllib_func=None, callback=None, error=None, id=None): +    def __init__(self, url, urllib_func=None, +                 callback=None, error=None, id=None):          self.url = url          self.id = id          self.callback = callback @@ -862,7 +882,6 @@ class HTTPClient:          self.callback = None          self.error = None -      def run(self):          def _invoke(func, data): @@ -896,65 +915,68 @@ class HTTPClient:                          try:                              data = json.loads(data)                          except: -                            _invoke(latest_sub_callback['error'], {'error' : 'json decoding error'}) +                            _invoke(latest_sub_callback['error'], +                                    {'error': 'json decoding error'})                              return                          if code != 200: -                            _invoke(latest_sub_callback['error'],data) +                            _invoke(latest_sub_callback['error'], data)                          else: -                            _invoke(latest_sub_callback['callback'],data) +                            _invoke(latest_sub_callback['callback'], data)          else:              try:                  data = json.loads(data)              except: -                _invoke(self.error, {'error' : 'json decoding error'}) +                _invoke(self.error, {'error': 'json decoding error'})                  return              if code != 200: -                _invoke(self.error,data) +                _invoke(self.error, data)              else: -                _invoke(self.callback,data) +                _invoke(self.callback, data)  def _urllib_request_2(url, timeout=320):      try: -        resp = urllib2.urlopen(url,timeout=timeout) +        resp = urllib2.urlopen(url, timeout=timeout)      except urllib2.HTTPError as http_error:          resp = http_error -    return (resp.read(),resp.code) +    return (resp.read(), resp.code) +  def _urllib_request_3(url, timeout=320):      #print(url)      try: -        resp = urllib.request.urlopen(url,timeout=timeout) +        resp = urllib.request.urlopen(url, timeout=timeout)      except urllib.request.HTTPError as http_error:          resp = http_error -    r =   resp.read().decode("utf-8") +    r = resp.read().decode("utf-8")      #print(r) -    return (r,resp.code) +    return (r, resp.code)  _urllib_request = None +  class Pubnub(PubnubCoreAsync):      def __init__(          self,          publish_key,          subscribe_key, -        secret_key = False, -        cipher_key = False, -        auth_key = None, -        ssl_on = False, -        origin = 'pubsub.pubnub.com', -        pres_uuid = None -    ) : +        secret_key=False, +        cipher_key=False, +        auth_key=None, +        ssl_on=False, +        origin='pubsub.pubnub.com', +        pres_uuid=None +    ):          super(Pubnub, self).__init__( -            publish_key = publish_key, -            subscribe_key = subscribe_key, -            secret_key = secret_key, -            cipher_key = cipher_key, -            auth_key = auth_key, -            ssl_on = ssl_on, -            origin = origin, -            uuid = pres_uuid, +            publish_key=publish_key, +            subscribe_key=subscribe_key, +            secret_key=secret_key, +            cipher_key=cipher_key, +            auth_key=auth_key, +            ssl_on=ssl_on, +            origin=origin, +            uuid=pres_uuid,              _tt_lock=threading.RLock(),              _channel_list_lock=threading.RLock()          ) @@ -971,29 +993,30 @@ class Pubnub(PubnubCoreAsync):          thread = threading.Thread(target=cb)          thread.start() - -    def _request_async( self, request, callback=None, error=None, single=False ) : +    def _request_async(self, request, callback=None, error=None, single=False):          global _urllib_request          ## Build URL          url = self.getUrl(request)          if single is True:              id = time.time() -            client = HTTPClient(url=url, urllib_func=_urllib_request, callback=None, error=None, id=id) +            client = HTTPClient(url=url, urllib_func=_urllib_request, +                                callback=None, error=None, id=id)              with latest_sub_callback_lock:                  latest_sub_callback['id'] = id                  latest_sub_callback['callback'] = callback                  latest_sub_callback['error'] = error          else: -            client = HTTPClient(url=url, urllib_func=_urllib_request, callback=callback, error=error) +            client = HTTPClient(url=url, urllib_func=_urllib_request, +                                callback=callback, error=error)          thread = threading.Thread(target=client.run)          thread.start() +          def abort(): -            client.cancel(); +            client.cancel()          return abort - -    def _request_sync( self, request) : +    def _request_sync(self, request):          global _urllib_request          ## Build URL          url = self.getUrl(request) @@ -1002,14 +1025,14 @@ class Pubnub(PubnubCoreAsync):          try:              resp_json = json.loads(response[0])          except: -            return [0,"JSON Error"] +            return [0, "JSON Error"]          if response[1] != 200 and 'status' in resp_json: -            return {'message' : resp_json['message'], 'payload' : resp_json['payload']} +            return {'message': resp_json['message'], +                    'payload': resp_json['payload']}          return resp_json -      def _request(self, request, callback=None, error=None, single=False):          if callback is None:              return self._request_sync(request) @@ -1027,7 +1050,7 @@ class Pubnub(PubnubCoreAsync):              resp_json = json.loads(response.read().decode("utf-8"))          except Exception as e:              return None -             +          return resp_json      def _request3_async( self, request, callback, single=False ) : diff --git a/python/examples/dev-console.py b/python/examples/dev-console.py index 383fa68..7814cef 100755 --- a/python/examples/dev-console.py +++ b/python/examples/dev-console.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -55,41 +55,55 @@ parser.add_option("--uuid",  print(options) -pubnub = Pubnub(options.publish_key, options.subscribe_key, options.secret_key, options.cipher_key, options.auth_key, options.ssl, options.origin, options.uuid) +pubnub = Pubnub(options.publish_key, +                options.subscribe_key, +                options.secret_key, +                options.cipher_key, +                options.auth_key, +                options.ssl, +                options.origin, +                options.uuid)  class color: -   PURPLE = '\033[95m' -   CYAN = '\033[96m' -   DARKCYAN = '\033[36m' -   BLUE = '\033[94m' -   GREEN = '\033[92m' -   YELLOW = '\033[93m' -   RED = '\033[91m' -   BOLD = '\033[1m' -   UNDERLINE = '\033[4m' -   END = '\033[0m' +    PURPLE = '\033[95m' +    CYAN = '\033[96m' +    DARKCYAN = '\033[36m' +    BLUE = '\033[94m' +    GREEN = '\033[92m' +    YELLOW = '\033[93m' +    RED = '\033[91m' +    BOLD = '\033[1m' +    UNDERLINE = '\033[4m' +    END = '\033[0m'  from datetime import datetime +  def print_ok(msg, channel=None): -    chstr = color.PURPLE + "[" + datetime.now().strftime('%Y-%m-%d %H:%M:%S') + "] " + color.END -    chstr += color.CYAN + "[Channel : " + channel + "] " if channel is not None else "" + color.END +    chstr = color.PURPLE + "[" + datetime.now().strftime( +        '%Y-%m-%d %H:%M:%S') + "] " + color.END +    chstr += color.CYAN + "[Channel : " + channel + \ +        "] " if channel is not None else "" + color.END      try: -        print(chstr + color.GREEN +  str(msg) + color.END) +        print(chstr + color.GREEN + str(msg) + color.END)      except Exception as e:          print(msg) +  def print_error(msg, channel=None): -    chstr = color.PURPLE + "[" + datetime.now().strftime('%Y-%m-%d %H:%M:%S') + "] " + color.END -    chstr += color.CYAN + "[Channel : " + channel + "] " if channel is not None else "" + color.END +    chstr = color.PURPLE + "[" + datetime.now().strftime( +        '%Y-%m-%d %H:%M:%S') + "] " + color.END +    chstr += color.CYAN + "[Channel : " + channel + \ +        "] " if channel is not None else "" + color.END      try: -        print( chstr + color.RED + color.BOLD +str(msg) + color.END) +        print(chstr + color.RED + color.BOLD + str(msg) + color.END)      except:          print(msg)  import threading +  def kill_all_threads():      for thread in threading.enumerate():          if thread.isAlive(): @@ -101,6 +115,7 @@ def kill_all_threads():                  #thread.exit()                  #print(str(thread.getName()) + ' could not be terminated') +  def get_input(message, t=None):      while True:          try: @@ -117,7 +132,8 @@ def get_input(message, t=None):                  raise ValueError              if t is not None and t == bool: -                if command in ["True", "true", "1", 1, "y", "Y", "yes", "Yes", "YES"]: +                valid = ["True", "true", "1", 1, "y", "Y", "yes", "Yes", "YES"] +                if command in valid:                      return True                  else:                      return False @@ -131,18 +147,20 @@ def get_input(message, t=None):              print_error("Invalid input : " + command) -  def _publish_command_handler():      channel = get_input("[PUBLISH] Enter Channel Name ", str)      if channel is None:          return      while True: -        message = get_input("[PUBLISH] Enter Message ( QUIT or CTRL-C for exit from publish mode ) ") -        if message == 'QUIT' or message == 'quit' or message == None: -            return   +        message = get_input("[PUBLISH] Enter Message \ +            ( QUIT or CTRL-C for exit from publish mode ) ") +        if message == 'QUIT' or message == 'quit' or message is None: +            return +          def _callback(r):              print_ok(r) +          def _error(r):              print_error(r)          pubnub.publish(channel, message, _callback, _error) @@ -150,23 +168,30 @@ def _publish_command_handler():  def _subscribe_command_handler():      channel = get_input("[SUBSCRIBE] Enter Channel Name ", str) +      def _callback(r):          print_ok(r, channel) +      def _error(r):          print_error(r, channel)      pubnub.subscribe(channel, _callback, _error) +  def _unsubscribe_command_handler():      channel = get_input("[UNSUBSCRIBE] Enter Channel Name ", str) +      def _callback(r):          print_ok(r) +      def _error(r):          print_error(r)      pubnub.unsubscribe(channel) +  def _grant_command_handler():      def _callback(r):          print_ok(r) +      def _error(r):          print_error(r)      channel = get_input("[GRANT] Enter Channel Name ", str) @@ -174,11 +199,13 @@ def _grant_command_handler():      ttl = get_input("[GRANT] Enter ttl ", int)      read = get_input("[GRANT] Read ? ", bool)      write = get_input("[GRANT] Write ? ", bool) -    pubnub.grant(channel, auth_key,read,write,ttl, _callback) +    pubnub.grant(channel, auth_key, read, write, ttl, _callback) +  def _revoke_command_handler():      def _callback(r):          print_ok(r) +      def _error(r):          print_error(r)      channel = get_input("[REVOKE] Enter Channel Name ", str) @@ -187,18 +214,22 @@ def _revoke_command_handler():      pubnub.revoke(channel, auth_key, ttl, _callback) +  def _audit_command_handler():      def _callback(r):          print_ok(r) +      def _error(r):          print_error(r)      channel = get_input("[AUDIT] Enter Channel Name ", str)      auth_key = get_input("[AUDIT] Enter Auth Key ", str)      pubnub.audit(channel, auth_key, _callback) +  def _history_command_handler():      def _callback(r):          print_ok(r) +      def _error(r):          print_error(r)      channel = get_input("[HISTORY] Enter Channel Name ", str) @@ -210,6 +241,7 @@ def _history_command_handler():  def _here_now_command_handler():      def _callback(r):          print_ok(r) +      def _error(r):          print_error(r)      channel = get_input("[HERE NOW] Enter Channel Name ", str) @@ -218,28 +250,32 @@ def _here_now_command_handler():  commands = [] -commands.append({"command" : "publish", "handler" : _publish_command_handler}) -commands.append({"command" : "subscribe", "handler" : _subscribe_command_handler}) -commands.append({"command" : "unsubscribe", "handler" : _unsubscribe_command_handler}) -commands.append({"command" : "here_now", "handler" : _here_now_command_handler}) -commands.append({"command" : "history", "handler" : _history_command_handler}) -commands.append({"command" : "grant", "handler" : _grant_command_handler}) -commands.append({"command" : "revoke", "handler" : _revoke_command_handler}) -commands.append({"command" : "audit", "handler" : _audit_command_handler}) +commands.append({"command": "publish", "handler": _publish_command_handler}) +commands.append( +    {"command": "subscribe", "handler": _subscribe_command_handler}) +commands.append( +    {"command": "unsubscribe", "handler": _unsubscribe_command_handler}) +commands.append( +    {"command": "here_now", "handler": _here_now_command_handler}) +commands.append({"command": "history", "handler": _history_command_handler}) +commands.append({"command": "grant", "handler": _grant_command_handler}) +commands.append({"command": "revoke", "handler": _revoke_command_handler}) +commands.append({"command": "audit", "handler": _audit_command_handler})  # last command is quit. add new commands before this line -commands.append({"command" : "QUIT"}) +commands.append({"command": "QUIT"}) +  def get_help():      help = ""      help += "Channels currently subscribed to : "      help += str(pubnub.get_channel_array())      help += "\n" -    for i,v in enumerate(commands): +    for i, v in enumerate(commands):          help += "Enter " + str(i) + " for " + v['command'] + "\n"      return help -             +  while True:      command = get_input(color.BLUE + get_help(), int)      if command == len(commands) - 1 or command is None: diff --git a/python/examples/here-now-example.py b/python/examples/here-now-example.py index b9f0b02..0888410 100644 --- a/python/examples/here-now-example.py +++ b/python/examples/here-now-example.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -14,24 +14,24 @@ sys.path.append('../')  sys.path.append('./')  from Pubnub import Pubnub -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or '' -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len(sys.argv) > 4 and sys.argv[4] or '' +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## ----------------------------------------------------------------------- -pubnub = Pubnub( publish_key=publish_key, subscribe_key=subscribe_key, -    secret_key=secret_key, cipher_key=cipher_key, ssl_on=ssl_on) -crazy  = 'hello_world' +pubnub = Pubnub(publish_key=publish_key, subscribe_key=subscribe_key, +                secret_key=secret_key, cipher_key=cipher_key, ssl_on=ssl_on) +crazy = 'hello_world' +  def print_cb(message): -	print(message) +    print(message) -pubnub.here_now( { -    'channel'  : crazy, -    'callback' : print_cb +pubnub.here_now({ +    'channel': crazy, +    'callback': print_cb  }) - diff --git a/python/examples/history-example.py b/python/examples/history-example.py index bf78c7d..b5cc1fd 100755 --- a/python/examples/history-example.py +++ b/python/examples/history-example.py @@ -4,12 +4,11 @@ sys.path.append('./')  from Pubnub import Pubnub  ## Initiat Class -pubnub = Pubnub( 'demo', 'demo', None, False ) +pubnub = Pubnub('demo', 'demo', None, False)  ## History Example  history = pubnub.history({ -    'channel' : 'hello_world', -    'limit'   : 1 +    'channel': 'hello_world', +    'limit': 1  })  print(history) - diff --git a/python/examples/publish-example.py b/python/examples/publish-example.py index e632aef..ebf3c73 100755 --- a/python/examples/publish-example.py +++ b/python/examples/publish-example.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -15,54 +15,62 @@ sys.path.append('../')  sys.path.append('../../')  from Pubnub import Pubnub -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or ''     ##(Cipher key is Optional) -auth_key    = len(sys.argv) > 5 and sys.argv[4] or 'abcd'     ##(Cipher key is Optional) -ssl_on        = len(sys.argv) > 6 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len( +    sys.argv) > 4 and sys.argv[4] or ''  # (Cipher key is Optional) +auth_key = len( +    sys.argv) > 5 and sys.argv[4] or 'abcd'  # (Cipher key is Optional) +ssl_on = len(sys.argv) > 6 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## ----------------------------------------------------------------------- -pubnub = Pubnub( publish_key, subscribe_key, secret_key, cipher_key, auth_key, ssl_on ) -crazy  = 'hello_world' +pubnub = Pubnub( +    publish_key, subscribe_key, secret_key, cipher_key, auth_key, ssl_on) +crazy = 'hello_world'  ## -----------------------------------------------------------------------  ## Publish Example  ## ----------------------------------------------------------------------- + +  def publish_complete(info):      print(info) +  def publish_error(info): -    print('ERROR : ' +  str(info)) +    print('ERROR : ' + str(info))  ## Publish string  pubnub.publish({ -    'channel' : crazy, -    'message' : 'Hello World!', -    'callback' : publish_complete, -    'error' : publish_error +    'channel': crazy, +    'message': 'Hello World!', +    'callback': publish_complete, +    'error': publish_error  })  ## Publish list -li = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] +li = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', +      'Saturday']  pubnub.publish({ -    'channel' : crazy, -    'message' : li, -    'callback' : publish_complete, -    'error' : publish_error +    'channel': crazy, +    'message': li, +    'callback': publish_complete, +    'error': publish_error  }) +  def done_cb(info):      publish_complete(info)  pubnub.publish({ -    'channel' : crazy, -    'message' : { 'some_key' : 'some_val' }, -    'callback' : done_cb, -    'error' : publish_error +    'channel': crazy, +    'message': {'some_key': 'some_val'}, +    'callback': done_cb, +    'error': publish_error  }) diff --git a/python/examples/subscribe-example.py b/python/examples/subscribe-example.py index a67a08f..0a18899 100755 --- a/python/examples/subscribe-example.py +++ b/python/examples/subscribe-example.py @@ -8,48 +8,55 @@ import string  from Pubnub import Pubnub  ## Initiate Class -pubnub = Pubnub( 'demo', 'demo', None, False ) +pubnub = Pubnub('demo', 'demo', None, False) -print("My UUID is: "+pubnub.uuid) +print("My UUID is: " + pubnub.uuid) -channel = ''.join(random.choice(string.ascii_letters + string.digits) for x in range(20)) +channel = ''.join( +    random.choice(string.ascii_letters + string.digits) for x in range(20))  ## Subscribe Example -def receive(message) : + + +def receive(message):      print(message)      return False +  def pres_event(message):      print(message)      return False +  def subscribe():      print("Listening for messages on '%s' channel..." % channel)      pubnub.subscribe({ -        'channel'  : channel, -        'callback' : receive  +        'channel': channel, +        'callback': receive      }) +  def presence():      print("Listening for presence events on '%s' channel..." % channel)      pubnub.presence({ -        'channel'  : channel, -        'callback' : pres_event  +        'channel': channel, +        'callback': pres_event      }) +  def publish():      print("Publishing a test message on '%s' channel..." % channel)      pubnub.publish({ -        'channel'  : channel, -        'message'  : { 'text':'foo bar' } +        'channel': channel, +        'message': {'text': 'foo bar'}      })  pres_thread = threading.Thread(target=presence) -pres_thread.daemon=True +pres_thread.daemon = True  pres_thread.start()  sub_thread = threading.Thread(target=subscribe) -sub_thread.daemon=True +sub_thread.daemon = True  sub_thread.start()  time.sleep(3) @@ -60,7 +67,6 @@ publish()  print("waiting for subscribes and presence")  pres_thread.join() -print(pubnub.here_now({'channel':channel})) +print(pubnub.here_now({'channel': channel}))  sub_thread.join() - diff --git a/python/tests/subscribe-test.py b/python/tests/subscribe-test.py index be4a416..d8a3ea2 100755 --- a/python/tests/subscribe-test.py +++ b/python/tests/subscribe-test.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -16,18 +16,18 @@ from Pubnub import Pubnub  from functools import partial  from threading import current_thread  import threading -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or 'demo' -cipher_key    = len(sys.argv) > 4 and sys.argv[4] or None -ssl_on        = len(sys.argv) > 5 and bool(sys.argv[5]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or 'demo' +cipher_key = len(sys.argv) > 4 and sys.argv[4] or None +ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False  ## -----------------------------------------------------------------------  ## Initiate Pubnub State  ## -----------------------------------------------------------------------  #pubnub = Pubnub( publish_key, subscribe_key, secret_key, cipher_key, ssl_on ) -pubnub = Pubnub( publish_key, subscribe_key, secret_key, ssl_on ) -crazy  = 'hello_world' +pubnub = Pubnub(publish_key, subscribe_key, secret_key, ssl_on) +crazy = 'hello_world'  current = -1 @@ -37,9 +37,12 @@ received = 0  ## -----------------------------------------------------------------------  ## Subscribe Example  ## ----------------------------------------------------------------------- + +  def message_received(message):      print(message) +  def check_received(message):      global current      global errors @@ -52,19 +55,20 @@ def check_received(message):          errors += 1      else:          received += 1 -    print('active thread count : ' + str( threading.activeCount())) +    print('active thread count : ' + str(threading.activeCount()))      print('errors = ' + str(errors)) -    print(current_thread().getName() +  ' , ' +  'received = ' +  str(received)) +    print(current_thread().getName() + ' , ' + 'received = ' + str(received))      if received != message: -        print('********** MISSED **************** ' + str( message - received )) +        print('********** MISSED **************** ' + str(message - received))      current = message -     -def connected_test(ch) : -    print('Connected '  +  ch) -def connected(ch) : +def connected_test(ch): +    print('Connected ' + ch) + + +def connected(ch):      pass @@ -75,56 +79,60 @@ pubnub.subscribe({      'callback' : message_received  })  ''' + +  def cb1(): -	pubnub.subscribe({ -	    'channel'  : 'efgh1', -	    'connect'  : connected, -	    'callback' : message_received -	}) +    pubnub.subscribe({ +        'channel': 'efgh1', +        'connect': connected, +        'callback': message_received +    }) +  def cb2(): -	pubnub.subscribe({ -	    'channel'  : 'dsm-test', -	    'connect'  : connected_test, -	    'callback' : check_received -	}) +    pubnub.subscribe({ +        'channel': 'dsm-test', +        'connect': connected_test, +        'callback': check_received +    }) +  def cb3(): -    pubnub.unsubscribe({'channel' : 'efgh1'}) +    pubnub.unsubscribe({'channel': 'efgh1'}) -def cb4(): -    pubnub.unsubscribe({'channel' : 'abcd1'}) -def subscribe(channel): -	pubnub.subscribe({ -	    'channel'  : channel, -	    'connect'  : connected, -	    'callback' : message_received -	}) +def cb4(): +    pubnub.unsubscribe({'channel': 'abcd1'}) +def subscribe(channel): +    pubnub.subscribe({ +        'channel': channel, +        'connect': connected, +        'callback': message_received +    }) -pubnub.timeout(15,cb1) +pubnub.timeout(15, cb1) -pubnub.timeout(30,cb2) +pubnub.timeout(30, cb2) -pubnub.timeout(45,cb3) +pubnub.timeout(45, cb3) -pubnub.timeout(60,cb4) +pubnub.timeout(60, cb4)  #''' -for x in range(1,1000): +for x in range(1, 1000):      #print x      def y(t):          subscribe('channel-' + str(t))      def z(t): -        pubnub.unsubscribe({'channel' : 'channel-' + str(t)}) +        pubnub.unsubscribe({'channel': 'channel-' + str(t)}) -    pubnub.timeout(x + 5, partial(y,x)) -    pubnub.timeout(x + 25, partial(z, x))  +    pubnub.timeout(x + 5, partial(y, x)) +    pubnub.timeout(x + 25, partial(z, x))      x += 10  #''' diff --git a/python/tests/unit-test.py b/python/tests/unit-test.py index 762959e..fd1bb97 100755 --- a/python/tests/unit-test.py +++ b/python/tests/unit-test.py @@ -1,4 +1,4 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud.  +## www.pubnub.com - PubNub Real-time push service in the cloud.  # coding=utf8  ## PubNub Real-time Push APIs and Notifications Framework @@ -15,53 +15,55 @@ sys.path.append('..')  sys.path.append('../common')  from Pubnub import Pubnub -publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo'  subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' -secret_key    = len(sys.argv) > 3 and sys.argv[3] or None -ssl_on        = len(sys.argv) > 4 and bool(sys.argv[4]) or False +secret_key = len(sys.argv) > 3 and sys.argv[3] or None +ssl_on = len(sys.argv) > 4 and bool(sys.argv[4]) or False  ## -----------------------------------------------------------------------  ## Initiat Class  ## ----------------------------------------------------------------------- -pubnub = Pubnub( publish_key, subscribe_key, secret_key, ssl_on ) -crazy  = 'demo' +pubnub = Pubnub(publish_key, subscribe_key, secret_key, ssl_on) +crazy = 'demo'  ## ---------------------------------------------------------------------------  ## Unit Test Function  ## --------------------------------------------------------------------------- -def test( trial, name ) : -    if trial : -        print( 'PASS: ' + name ) -    else : -        print( 'FAIL: ' + name ) + + +def test(trial, name): +    if trial: +        print('PASS: ' + name) +    else: +        print('FAIL: ' + name)  ## -----------------------------------------------------------------------  ## Publish Example  ## -----------------------------------------------------------------------  publish_success = pubnub.publish({ -    'channel' : crazy, -    'message' : crazy +    'channel': crazy, +    'message': crazy  }) -test( publish_success[0] == 1, 'Publish First Message Success' ) +test(publish_success[0] == 1, 'Publish First Message Success')  ## -----------------------------------------------------------------------  ## History Example  ## -----------------------------------------------------------------------  history = pubnub.history({ -    'channel' : crazy, -    'limit'   : 1 +    'channel': crazy, +    'limit': 1  })  test(      history[0] == crazy,      'History Message: ' + history[0]  ) -test( len(history) == 1, 'History Message Count' ) +test(len(history) == 1, 'History Message Count')  ## -----------------------------------------------------------------------  ## PubNub Server Time Example  ## -----------------------------------------------------------------------  timestamp = pubnub.time() -test( timestamp > 0, 'PubNub Server Time: ' + str(timestamp) ) +test(timestamp > 0, 'PubNub Server Time: ' + str(timestamp)) diff --git a/python/unassembled/Platform.py b/python/unassembled/Platform.py index 0ffccbb..83bb6f5 100644 --- a/python/unassembled/Platform.py +++ b/python/unassembled/Platform.py @@ -10,13 +10,12 @@ import threading  from threading import current_thread  latest_sub_callback_lock = threading.RLock() -latest_sub_callback = {'id' : None, 'callback' : None} - - +latest_sub_callback = {'id': None, 'callback': None}  class HTTPClient: -    def __init__(self, url, urllib_func=None, callback=None, error=None, id=None): +    def __init__(self, url, urllib_func=None, +                 callback=None, error=None, id=None):          self.url = url          self.id = id          self.callback = callback @@ -29,7 +28,6 @@ class HTTPClient:          self.callback = None          self.error = None -      def run(self):          def _invoke(func, data): @@ -63,65 +61,68 @@ class HTTPClient:                          try:                              data = json.loads(data)                          except: -                            _invoke(latest_sub_callback['error'], {'error' : 'json decoding error'}) +                            _invoke(latest_sub_callback['error'], +                                    {'error': 'json decoding error'})                              return                          if code != 200: -                            _invoke(latest_sub_callback['error'],data) +                            _invoke(latest_sub_callback['error'], data)                          else: -                            _invoke(latest_sub_callback['callback'],data) +                            _invoke(latest_sub_callback['callback'], data)          else:              try:                  data = json.loads(data)              except: -                _invoke(self.error, {'error' : 'json decoding error'}) +                _invoke(self.error, {'error': 'json decoding error'})                  return              if code != 200: -                _invoke(self.error,data) +                _invoke(self.error, data)              else: -                _invoke(self.callback,data) +                _invoke(self.callback, data)  def _urllib_request_2(url, timeout=320):      try: -        resp = urllib2.urlopen(url,timeout=timeout) +        resp = urllib2.urlopen(url, timeout=timeout)      except urllib2.HTTPError as http_error:          resp = http_error -    return (resp.read(),resp.code) +    return (resp.read(), resp.code) +  def _urllib_request_3(url, timeout=320):      #print(url)      try: -        resp = urllib.request.urlopen(url,timeout=timeout) +        resp = urllib.request.urlopen(url, timeout=timeout)      except urllib.request.HTTPError as http_error:          resp = http_error -    r =   resp.read().decode("utf-8") +    r = resp.read().decode("utf-8")      #print(r) -    return (r,resp.code) +    return (r, resp.code)  _urllib_request = None +  class Pubnub(PubnubCoreAsync):      def __init__(          self,          publish_key,          subscribe_key, -        secret_key = False, -        cipher_key = False, -        auth_key = None, -        ssl_on = False, -        origin = 'pubsub.pubnub.com', -        pres_uuid = None -    ) : +        secret_key=False, +        cipher_key=False, +        auth_key=None, +        ssl_on=False, +        origin='pubsub.pubnub.com', +        pres_uuid=None +    ):          super(Pubnub, self).__init__( -            publish_key = publish_key, -            subscribe_key = subscribe_key, -            secret_key = secret_key, -            cipher_key = cipher_key, -            auth_key = auth_key, -            ssl_on = ssl_on, -            origin = origin, -            uuid = pres_uuid, +            publish_key=publish_key, +            subscribe_key=subscribe_key, +            secret_key=secret_key, +            cipher_key=cipher_key, +            auth_key=auth_key, +            ssl_on=ssl_on, +            origin=origin, +            uuid=pres_uuid,              _tt_lock=threading.RLock(),              _channel_list_lock=threading.RLock()          ) @@ -138,29 +139,30 @@ class Pubnub(PubnubCoreAsync):          thread = threading.Thread(target=cb)          thread.start() - -    def _request_async( self, request, callback=None, error=None, single=False ) : +    def _request_async(self, request, callback=None, error=None, single=False):          global _urllib_request          ## Build URL          url = self.getUrl(request)          if single is True:              id = time.time() -            client = HTTPClient(url=url, urllib_func=_urllib_request, callback=None, error=None, id=id) +            client = HTTPClient(url=url, urllib_func=_urllib_request, +                                callback=None, error=None, id=id)              with latest_sub_callback_lock:                  latest_sub_callback['id'] = id                  latest_sub_callback['callback'] = callback                  latest_sub_callback['error'] = error          else: -            client = HTTPClient(url=url, urllib_func=_urllib_request, callback=callback, error=error) +            client = HTTPClient(url=url, urllib_func=_urllib_request, +                                callback=callback, error=error)          thread = threading.Thread(target=client.run)          thread.start() +          def abort(): -            client.cancel(); +            client.cancel()          return abort - -    def _request_sync( self, request) : +    def _request_sync(self, request):          global _urllib_request          ## Build URL          url = self.getUrl(request) @@ -169,14 +171,14 @@ class Pubnub(PubnubCoreAsync):          try:              resp_json = json.loads(response[0])          except: -            return [0,"JSON Error"] +            return [0, "JSON Error"]          if response[1] != 200 and 'status' in resp_json: -            return {'message' : resp_json['message'], 'payload' : resp_json['payload']} +            return {'message': resp_json['message'], +                    'payload': resp_json['payload']}          return resp_json -      def _request(self, request, callback=None, error=None, single=False):          if callback is None:              return self._request_sync(request) @@ -194,7 +196,7 @@ class Pubnub(PubnubCoreAsync):              resp_json = json.loads(response.read().decode("utf-8"))          except Exception as e:              return None -             +          return resp_json      def _request3_async( self, request, callback, single=False ) : | 
