aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDevendra2014-04-23 14:03:13 +0530
committerDevendra2014-04-23 14:03:13 +0530
commit09cd0c015ae276aa849297a6a976065b2b3f247b (patch)
treef1b253aa856e3a16e36eea9213857a33f6c35df4
parentfdb46e56fa6794940f9fbe51a2863d58e927e655 (diff)
downloadpubnub-python-09cd0c015ae276aa849297a6a976065b2b3f247b.tar.bz2
modifying code for pep 8 compliance
-rw-r--r--common/PubnubBase.py226
-rw-r--r--common/PubnubCore.py53
-rw-r--r--common/PubnubCoreAsync.py146
-rw-r--r--common/PubnubCrypto.py63
-rw-r--r--common/PubnubUnitTest.py59
-rw-r--r--common/unit-test-async.py94
-rw-r--r--python-tornado/Pubnub.py566
-rw-r--r--python-tornado/examples/here-now-example.py22
-rw-r--r--python-tornado/examples/history-example.py26
-rw-r--r--python-tornado/examples/publish-example.py48
-rw-r--r--python-tornado/examples/subscribe-example.py27
-rw-r--r--python-tornado/examples/uuid-example.py5
-rw-r--r--python-tornado/tests/delivery.py140
-rwxr-xr-xpython-tornado/tests/subscribe-test.py90
-rw-r--r--python-tornado/tests/unit-tests.py82
-rw-r--r--python-tornado/unassembled/Platform.py47
-rw-r--r--python-twisted/Pubnub.py576
-rw-r--r--python-twisted/examples/here-now-example.py22
-rw-r--r--python-twisted/examples/history-example.py24
-rw-r--r--python-twisted/examples/publish-example.py52
-rw-r--r--python-twisted/examples/subscribe-example.py25
-rw-r--r--python-twisted/examples/uuid-example.py4
-rw-r--r--python-twisted/tests/delivery.py140
-rwxr-xr-xpython-twisted/tests/subscribe-test.py86
-rw-r--r--python-twisted/tests/unit-test-full.py177
-rw-r--r--python-twisted/tests/unit-tests.py148
-rw-r--r--python-twisted/unassembled/Platform.py57
-rw-r--r--python/Pubnub.py521
-rwxr-xr-xpython/examples/dev-console.py106
-rw-r--r--python/examples/here-now-example.py26
-rwxr-xr-xpython/examples/history-example.py7
-rwxr-xr-xpython/examples/publish-example.py52
-rwxr-xr-xpython/examples/subscribe-example.py34
-rwxr-xr-xpython/tests/subscribe-test.py90
-rwxr-xr-xpython/tests/unit-test.py38
-rw-r--r--python/unassembled/Platform.py86
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 ) :