From 765ee5db6fc39d77e55dcf4fe97fb96da2f46d30 Mon Sep 17 00:00:00 2001 From: Devendra Date: Wed, 2 Apr 2014 02:44:29 +0530 Subject: multiplexing support --- python-twisted/Pubnub.py | 329 +++++++++++++++++++++++++-------- python-twisted/unassembled/Platform.py | 28 ++- 2 files changed, 276 insertions(+), 81 deletions(-) (limited to 'python-twisted') diff --git a/python-twisted/Pubnub.py b/python-twisted/Pubnub.py index 66534b5..3bc2d35 100644 --- a/python-twisted/Pubnub.py +++ b/python-twisted/Pubnub.py @@ -16,7 +16,7 @@ from base64 import encodestring, decodestring import hashlib import hmac -class PubnubCrypto() : +class PubnubCrypto2() : """ #** #* PubnubCrypto @@ -93,13 +93,89 @@ class PubnubCrypto() : return self.depad((cipher.decrypt(decodestring(msg)))) +class PubnubCrypto3() : + """ + #** + #* PubnubCrypto + #* + #** + + ## Initiate Class + pc = PubnubCrypto + + """ + + def pad( self, msg, block_size=16 ): + """ + #** + #* pad + #* + #* pad the text to be encrypted + #* appends a padding character to the end of the String + #* until the string has block_size length + #* @return msg with padding. + #** + """ + padding = block_size - (len(msg) % block_size) + return msg + (chr(padding)*padding).encode('utf-8') + + def depad( self, msg ): + """ + #** + #* depad + #* + #* depad the decryptet message" + #* @return msg without padding. + #** + """ + return msg[0:-ord(msg[-1])] + + def getSecret( self, key ): + """ + #** + #* getSecret + #* + #* hases the key to MD5 + #* @return key in MD5 format + #** + """ + return hashlib.sha256(key.encode("utf-8")).hexdigest() + + def encrypt( self, key, msg ): + """ + #** + #* encrypt + #* + #* encrypts the message + #* @return message in encrypted format + #** + """ + 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 ): + """ + #** + #* decrypt + #* + #* decrypts the message + #* @return message in decryped format + #** + """ + 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') + + try: import json except ImportError: import simplejson as json import time import hashlib -import urllib2 -import uuid +import uuid +import sys class PubnubBase(object): def __init__( @@ -137,7 +213,7 @@ class PubnubBase(object): self.secret_key = secret_key self.cipher_key = cipher_key self.ssl = ssl_on - self.pc = PubnubCrypto() + if self.ssl : self.origin = 'https://' + self.origin @@ -145,8 +221,16 @@ class PubnubBase(object): 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() + else: + self.python_version = 3 + self.pc = PubnubCrypto3() + - if not isinstance(self.uuid, basestring): + if not isinstance(self.uuid, str): raise AttributeError("pres_uuid must be a string") def sign(self, channel, message): @@ -177,6 +261,14 @@ class PubnubBase(object): return message + 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']}) + else: + if (callback != None):callback(response) + if (callback != None): return _new_format_callback + def publish( self, args ) : """ @@ -207,7 +299,7 @@ class PubnubBase(object): channel = str(args['channel']) ## Capture Callback - if args.has_key('callback') : + if 'callback' in args : callback = args['callback'] else : callback = None @@ -226,7 +318,7 @@ class PubnubBase(object): channel, '0', message - ]}, callback) + ]'urlparams' : {'auth' : self.auth_key}}, self._return_wrapped_callback(callback)) def presence( self, args ) : """ @@ -266,7 +358,7 @@ class PubnubBase(object): callback = args['callback'] subscribe_key = args.get('subscribe_key') or self.subscribe_key - return self.subscribe({'channel': channel+'-pnpres', 'subscribe_key':subscribe_key, 'callback': callback}) + return self.subscribe({'channel': channel+'-pnpres', 'subscribe_key':subscribe_key, 'callback': self._return_wrapped_callback(callback)}) def here_now( self, args ) : @@ -291,7 +383,7 @@ class PubnubBase(object): channel = str(args['channel']) ## Capture Callback - if args.has_key('callback') : + if 'callback' in args : callback = args['callback'] else : callback = None @@ -329,7 +421,7 @@ class PubnubBase(object): """ ## Capture User Input - limit = args.has_key('limit') and int(args['limit']) or 10 + limit = 'limit' in args and int(args['limit']) or 10 channel = str(args['channel']) ## Fail if bad input. @@ -338,7 +430,7 @@ class PubnubBase(object): return False ## Capture Callback - if args.has_key('callback') : + if 'callback' in args : callback = args['callback'] else : callback = None @@ -377,18 +469,18 @@ class PubnubBase(object): params = dict() count = 100 - if args.has_key('count'): + if 'count' in args: count = int(args['count']) params['count'] = str(count) - if args.has_key('reverse'): + if 'reverse' in args: params['reverse'] = str(args['reverse']).lower() - if args.has_key('start'): + if 'start' in args: params['start'] = str(args['start']) - if args.has_key('end'): + if 'end' in args: params['end'] = str(args['end']) ## Fail if bad input. @@ -397,7 +489,7 @@ class PubnubBase(object): return False ## Capture Callback - if args.has_key('callback') : + if 'callback' in args : callback = args['callback'] else : callback = None @@ -428,7 +520,7 @@ class PubnubBase(object): """ ## Capture Callback - if args and args.has_key('callback') : + if args and 'callback' in args : callback = args['callback'] else : callback = None @@ -454,8 +546,8 @@ class PubnubBase(object): hex(ord(ch)).replace( '0x', '%' ).upper() or ch for ch in list(bit) ]) for bit in request["urlcomponents"]]) - if (request.has_key("urlparams")): - url = url + '?' + "&".join([ x + "=" + y for x,y in request["urlparams"].iteritems()]) + if ("urlparams" in request): + url = url + '?' + "&".join([ x + "=" + y for x,y in request["urlparams"].items()]) return url @@ -471,8 +563,6 @@ class PubnubCoreAsync(PubnubBase): def start(self): pass def stop(self): pass - def timeout( self, delay, callback ): - pass def __init__( self, @@ -515,8 +605,23 @@ class PubnubCoreAsync(PubnubBase): self.timetoken = 0 self.version = '3.3.4' self.accept_encoding = 'gzip' - - def subscribe( self, args ) : + self.SUB_RECEIVER = None + self._connect = None + + def get_channel_list(self, channels): + channel = '' + first = True + for ch in channels: + if not channels[ch]['subscribed']: + continue + if not first: + channel += ',' + else: + first = False + channel += ch + return channel + + def subscribe( self, args=None, sync=False ) : """ #** #* Subscribe @@ -548,97 +653,143 @@ class PubnubCoreAsync(PubnubBase): }) """ - ## Fail if missing channel - if not 'channel' in args : - return 'Missing Channel.' - ## Fail if missing callback - if not 'callback' in args : - return 'Missing Callback.' + if sync is True and self.susbcribe_sync is not None: + self.susbcribe_sync(args) + return - ## Capture User Input - channel = str(args['channel']) - callback = args['callback'] - connectcb = args['connect'] + def _invoke(func,msg=None): + if func is not None: + if msg is not None: + func(msg) + else: + func() + + def _invoke_connect(): + for ch in self.subscriptions: + chobj = self.subscriptions[ch] + if chobj['connected'] is False: + chobj['connected'] = True + _invoke(chobj['connect']) + + def _invoke_error(err=None): + for ch in self.subscriptions: + 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 + + def _get_channel(): + for ch in self.subscriptions: + chobj = self.subscriptions[ch] + if chobj['subscribed'] is True: + return chobj - if 'errorback' in args: - errorback = args['errorback'] - else: - errorback = lambda x: x ## New Channel? - if not (channel in self.subscriptions) : + if not channel in self.subscriptions: self.subscriptions[channel] = { - 'first' : False, - 'connected' : False, + 'name' : channel, + 'first' : False, + 'connected' : False, + 'subscribed' : True, + 'callback' : callback, + 'connect' : connect, + 'disconnect' : disconnect, + 'reconnect' : reconnect } - ## Ensure Single Connection + ## return if already connected to channel if self.subscriptions[channel]['connected'] : - return "Already Connected" + _invoke(error, "Already Connected") + return + - self.subscriptions[channel]['connected'] = 1 ## SUBSCRIPTION RECURSION - def _subscribe(): - ## STOP CONNECTION? - if not self.subscriptions[channel]['connected']: - return + def _connect(): + self._reset_offline() + def sub_callback(response): - if not self.subscriptions[channel]['first'] : - self.subscriptions[channel]['first'] = True - connectcb() + print response + ## ERROR ? + if not response or error in response: + _invoke_error() - ## STOP CONNECTION? - if not self.subscriptions[channel]['connected']: - return + _invoke_connect() + self.timetoken = response[1] - ## PROBLEM? - if not response: - def time_callback(_time): - if not _time: - self.timeout( 1, _subscribe ) - return errorback("Lost Network Connection") - else: - self.timeout( 1, _subscribe) + 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]])) + else: + response_list = response[0] + chobj = _get_channel() + for r in response_list: + if chobj: + _invoke(chobj['callback'], self.decrypt(r)) - ## ENSURE CONNECTED (Call Time Function) - return self.time({ 'callback' : time_callback }) - self.timetoken = response[1] - _subscribe() + _connect() + - pc = PubnubCrypto() - out = [] - for message in response[0]: - callback(self.decrypt(message)) + channel_list = self.get_channel_list(self.subscriptions) + print channel_list ## CONNECT TO PUBNUB SUBSCRIBE SERVERS try: - self._request( { "urlcomponents" : [ + self.SUB_RECEIVER = self._request( { "urlcomponents" : [ 'subscribe', self.subscribe_key, - channel, + channel_list, '0', str(self.timetoken) - ], "urlparams" : {"uuid":self.uuid} }, sub_callback ) - except : - self.timeout( 1, _subscribe) + ], "urlparams" : {"uuid":self.uuid} }, sub_callback, single=True ) + except Exception as e: + self.timeout( 1, _connect) return + self._connect = _connect + + ## BEGIN SUBSCRIPTION (LISTEN FOR MESSAGES) - _subscribe() + _connect() + + def _reset_offline(self): + if self.SUB_RECEIVER is not None: + self.SUB_RECEIVER() + self.SUB_RECEIVER = None + + def CONNECT(self): + self._reset_offline() + self._connect() + + def unsubscribe( self, args ): + #print(args['channel']) channel = str(args['channel']) if not (channel in self.subscriptions): return False ## DISCONNECT self.subscriptions[channel]['connected'] = 0 + self.subscriptions[channel]['subscribed'] = False self.subscriptions[channel]['timetoken'] = 0 self.subscriptions[channel]['first'] = False + self.CONNECT() from twisted.web.client import getPage @@ -650,10 +801,14 @@ from twisted.web.client import HTTPConnectionPool from twisted.web.http_headers import Headers from twisted.internet.ssl import ClientContextFactory from twisted.internet.task import LoopingCall +import twisted +from hashlib import sha256 +import time pnconn_pool = HTTPConnectionPool(reactor, persistent=True) -pnconn_pool.maxPersistentPerHost = 100 +pnconn_pool.maxPersistentPerHost = 100000 pnconn_pool.cachedConnectionTimeout = 310 +pnconn_pool.retryAutomatically = True class Pubnub(PubnubCoreAsync): @@ -684,7 +839,7 @@ class Pubnub(PubnubCoreAsync): #self.headers['Accept-Encoding'] = [self.accept_encoding] self.headers['V'] = [self.version] - def _request( self, request, callback ) : + def _request( self, request, callback, single=False ) : global pnconn_pool ## Build URL @@ -696,24 +851,42 @@ class Pubnub(PubnubCoreAsync): ]) for bit in request]) ''' url = self.getUrl(request) + agent = ContentDecoderAgent(RedirectAgent(Agent( reactor, contextFactory = WebClientContextFactory(), pool = self.ssl and None or pnconn_pool )), [('gzip', GzipDecoder)]) + request = agent.request( 'GET', url, Headers(self.headers), None ) + if single is True: + id = time.time() + self.id = id + def received(response): finished = Deferred() response.deliverBody(PubNubResponse(finished)) return finished def complete(data): - callback(eval(data)) + if single is True: + if not id == self.id: + return None + try: + callback(eval(data)) + except Exception as e: + pass + #need error handling here + + def abort(): + pass request.addCallback(received) request.addBoth(complete) + return abort + class WebClientContextFactory(ClientContextFactory): def getContext(self, hostname, port): return ClientContextFactory.getContext(self) diff --git a/python-twisted/unassembled/Platform.py b/python-twisted/unassembled/Platform.py index 7318703..3b84b30 100644 --- a/python-twisted/unassembled/Platform.py +++ b/python-twisted/unassembled/Platform.py @@ -7,10 +7,14 @@ from twisted.web.client import HTTPConnectionPool from twisted.web.http_headers import Headers from twisted.internet.ssl import ClientContextFactory from twisted.internet.task import LoopingCall +import twisted +from hashlib import sha256 +import time pnconn_pool = HTTPConnectionPool(reactor, persistent=True) -pnconn_pool.maxPersistentPerHost = 100 +pnconn_pool.maxPersistentPerHost = 100000 pnconn_pool.cachedConnectionTimeout = 310 +pnconn_pool.retryAutomatically = True class Pubnub(PubnubCoreAsync): @@ -41,7 +45,7 @@ class Pubnub(PubnubCoreAsync): #self.headers['Accept-Encoding'] = [self.accept_encoding] self.headers['V'] = [self.version] - def _request( self, request, callback ) : + def _request( self, request, callback, single=False ) : global pnconn_pool ## Build URL @@ -53,24 +57,42 @@ class Pubnub(PubnubCoreAsync): ]) for bit in request]) ''' url = self.getUrl(request) + agent = ContentDecoderAgent(RedirectAgent(Agent( reactor, contextFactory = WebClientContextFactory(), pool = self.ssl and None or pnconn_pool )), [('gzip', GzipDecoder)]) + request = agent.request( 'GET', url, Headers(self.headers), None ) + if single is True: + id = time.time() + self.id = id + def received(response): finished = Deferred() response.deliverBody(PubNubResponse(finished)) return finished def complete(data): - callback(eval(data)) + if single is True: + if not id == self.id: + return None + try: + callback(eval(data)) + except Exception as e: + pass + #need error handling here + + def abort(): + pass request.addCallback(received) request.addBoth(complete) + return abort + class WebClientContextFactory(ClientContextFactory): def getContext(self, hostname, port): return ClientContextFactory.getContext(self) -- cgit v1.2.3 From 99096b8c11b9a541f6350639e8735495cf90091c Mon Sep 17 00:00:00 2001 From: Devendra Date: Fri, 11 Apr 2014 14:49:43 +0530 Subject: v1 MX and async code for python, twisted, tornado --- python-twisted/Pubnub.py | 246 ++++++++++++++++++++++++++------- python-twisted/tests/subscribe-test.py | 148 ++++++++++++++++++++ python-twisted/unassembled/Platform.py | 1 + 3 files changed, 346 insertions(+), 49 deletions(-) create mode 100755 python-twisted/tests/subscribe-test.py (limited to 'python-twisted') diff --git a/python-twisted/Pubnub.py b/python-twisted/Pubnub.py index 3bc2d35..7171efe 100644 --- a/python-twisted/Pubnub.py +++ b/python-twisted/Pubnub.py @@ -176,6 +176,14 @@ import time import hashlib import uuid import sys +from urllib import quote + +from base64 import urlsafe_b64encode +from hashlib import sha256 +from urllib import quote +from urllib import urlopen + +import hmac class PubnubBase(object): def __init__( @@ -184,6 +192,7 @@ class PubnubBase(object): subscribe_key, secret_key = False, cipher_key = False, + auth_key = None, ssl_on = False, origin = 'pubsub.pubnub.com', UUID = None @@ -213,6 +222,7 @@ class PubnubBase(object): self.secret_key = secret_key self.cipher_key = cipher_key self.ssl = ssl_on + self.auth_key = auth_key if self.ssl : @@ -247,6 +257,86 @@ class PubnubBase(object): signature = '0' return signature + def _pam_sign( self, msg ): + """Calculate a signature by secret key and message.""" + + return urlsafe_b64encode(hmac.new( + self.secret_key.encode("utf-8"), + msg.encode("utf-8"), + sha256 + ).digest()) + + def _pam_auth( self, query , apicode=0, callback=None): + """Issue an authenticated request.""" + + if 'timestamp' not in query: + query['timestamp'] = int(time.time()) + + ## Global Grant? + if 'auth' in query and not query['auth']: + del query['auth'] + + if 'channel' in query and not query['channel']: + del query['channel'] + + params = "&".join([ + x + "=" + quote( + str(query[x]), safe="" + ) for x in sorted(query) + ]) + sign_input = "{subkey}\n{pubkey}\n{apitype}\n{params}".format( + subkey=self.subscribe_key, + pubkey=self.publish_key, + apitype="audit" if (apicode) else "grant", + params=params + ) + + 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" , + 'sub-key', + self.subscribe_key + ], 'urlparams' : {'auth' : self.auth_key, 'signature' : signature}}, + self._return_wrapped_callback(callback)) + + 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 + }, callback=callback) + + def revoke( self, channel, authkey=False, read=False, write=False, ttl=1, callback=None): + """Revoke 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 + }, callback=callback) + + def audit(self, channel=False, authkey=False, callback=None): + return self._pam_auth({ + "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','')) @@ -318,7 +408,7 @@ class PubnubBase(object): channel, '0', message - ]'urlparams' : {'auth' : self.auth_key}}, self._return_wrapped_callback(callback)) + ], 'urlparams' : {'auth' : self.auth_key}}, self._return_wrapped_callback(callback)) def presence( self, args ) : """ @@ -520,7 +610,7 @@ class PubnubBase(object): """ ## Capture Callback - if args and 'callback' in args : + if args and 'callback' in args: callback = args['callback'] else : callback = None @@ -547,7 +637,7 @@ class PubnubBase(object): ch for ch in list(bit) ]) for bit in request["urlcomponents"]]) if ("urlparams" in request): - url = url + '?' + "&".join([ x + "=" + y for x,y in request["urlparams"].items()]) + url = url + '?' + "&".join([ x + "=" + str(y) for x,y in request["urlparams"].items()]) return url @@ -558,6 +648,9 @@ except ImportError: import Crypto.Hash.SHA256 as digestmod sha256 = digestmod.new import hmac +import threading +from threading import current_thread +import threading class PubnubCoreAsync(PubnubBase): @@ -570,6 +663,7 @@ class PubnubCoreAsync(PubnubBase): subscribe_key, secret_key = False, cipher_key = False, + auth_key = None, ssl_on = False, origin = 'pubsub.pubnub.com', uuid = None @@ -596,6 +690,7 @@ class PubnubCoreAsync(PubnubBase): subscribe_key=subscribe_key, secret_key=secret_key, cipher_key=cipher_key, + auth_key=auth_key, ssl_on=ssl_on, origin=origin, UUID=uuid @@ -603,22 +698,36 @@ class PubnubCoreAsync(PubnubBase): 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 = threading.RLock() def get_channel_list(self, channels): channel = '' first = True - for ch in channels: - if not channels[ch]['subscribed']: - continue - if not first: - channel += ',' - else: - first = False - channel += ch + if self._channel_list_lock: + with self._channel_list_lock: + for ch in channels: + if not channels[ch]['subscribed']: + continue + if not first: + channel += ',' + else: + first = False + channel += ch + else: + for ch in channels: + if not channels[ch]['subscribed']: + continue + if not first: + channel += ',' + else: + first = False + channel += ch + return channel def subscribe( self, args=None, sync=False ) : @@ -653,6 +762,26 @@ 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.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) @@ -666,18 +795,20 @@ class PubnubCoreAsync(PubnubBase): func() def _invoke_connect(): - for ch in self.subscriptions: - chobj = self.subscriptions[ch] - if chobj['connected'] is False: - chobj['connected'] = True - _invoke(chobj['connect']) + if self._channel_list_lock: + with self._channel_list_lock: + for ch in self.subscriptions: + chobj = self.subscriptions[ch] + if chobj['connected'] is False: + chobj['connected'] = True + _invoke(chobj['connect'],chobj['name']) def _invoke_error(err=None): for ch in self.subscriptions: chobj = self.subscriptions[ch] _invoke(chobj.error,err) - + ''' if callback is None: _invoke(error, "Callback Missing") return @@ -685,6 +816,7 @@ class PubnubCoreAsync(PubnubBase): if channel is None: _invoke(error, "Channel Missing") return + ''' def _get_channel(): for ch in self.subscriptions: @@ -695,22 +827,36 @@ class PubnubCoreAsync(PubnubBase): ## New Channel? if not channel in self.subscriptions: - self.subscriptions[channel] = { - 'name' : channel, - 'first' : False, - 'connected' : False, - 'subscribed' : True, - 'callback' : callback, - 'connect' : connect, - 'disconnect' : disconnect, - 'reconnect' : reconnect - } + if self._channel_list_lock: + with self._channel_list_lock: + self.subscriptions[channel] = { + 'name' : channel, + 'first' : False, + 'connected' : False, + 'subscribed' : True, + 'callback' : callback, + 'connect' : connect, + 'disconnect' : disconnect, + 'reconnect' : reconnect + } + else: + self.subscriptions[channel] = { + 'name' : channel, + 'first' : False, + 'connected' : False, + 'subscribed' : True, + 'callback' : callback, + 'connect' : connect, + 'disconnect' : disconnect, + 'reconnect' : reconnect + } ## return if already connected to channel - if self.subscriptions[channel]['connected'] : + 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 def _connect(): @@ -718,37 +864,37 @@ class PubnubCoreAsync(PubnubBase): self._reset_offline() def sub_callback(response): - print response ## ERROR ? if not response or error in response: _invoke_error() _invoke_connect() - - self.timetoken = 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]])) - else: - response_list = response[0] - chobj = _get_channel() - for r in response_list: - if chobj: - _invoke(chobj['callback'], self.decrypt(r)) - - - _connect() + with self._tt_lock: + #print 'A tt : ', self.timetoken , ' last tt : ' , self.last_timetoken + self.timetoken = self.last_timetoken if self.timetoken == 0 and self.last_timetoken != 0 else response[1] + #print 'B tt : ', self.timetoken , ' last tt : ' , self.last_timetoken + 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]])) + else: + response_list = response[0] + chobj = _get_channel() + for r in response_list: + if chobj: + _invoke(chobj['callback'], self.decrypt(r)) + + #with self._tt_lock: + # self.timetoken = self.last_timetoken if self.timetoken == 0 and self.last_timetoken != 0 else response[1] + _connect() channel_list = self.get_channel_list(self.subscriptions) - print channel_list ## CONNECT TO PUBNUB SUBSCRIBE SERVERS try: self.SUB_RECEIVER = self._request( { "urlcomponents" : [ @@ -759,6 +905,7 @@ class PubnubCoreAsync(PubnubBase): str(self.timetoken) ], "urlparams" : {"uuid":self.uuid} }, sub_callback, single=True ) except Exception as e: + print e self.timeout( 1, _connect) return @@ -838,6 +985,7 @@ class Pubnub(PubnubCoreAsync): self.headers['User-Agent'] = ['Python-Twisted'] #self.headers['Accept-Encoding'] = [self.accept_encoding] self.headers['V'] = [self.version] + self._channel_list_lock = None def _request( self, request, callback, single=False ) : global pnconn_pool diff --git a/python-twisted/tests/subscribe-test.py b/python-twisted/tests/subscribe-test.py new file mode 100755 index 0000000..0d4c65e --- /dev/null +++ b/python-twisted/tests/subscribe-test.py @@ -0,0 +1,148 @@ +## www.pubnub.com - PubNub Real-time push service in the cloud. +# coding=utf8 + +## PubNub Real-time Push APIs and Notifications Framework +## Copyright (c) 2010 Stephen Blum +## http://www.pubnub.com/ + +## ----------------------------------- +## PubNub 3.1 Real-time Push Cloud API +## ----------------------------------- + +import sys +sys.path.append('../') +import datetime +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' +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 + +## ----------------------------------------------------------------------- +## 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' + +current = -1 + +errors = 0 +received = 0 + +## ----------------------------------------------------------------------- +## Subscribe Example +## ----------------------------------------------------------------------- +def message_received(message): + print message + +def check_received(message): + global current + global errors + global received + print message + print current + if message <= current: + print 'ERROR' + #sys.exit() + errors += 1 + else: + received += 1 + print 'active thread count : ', threading.activeCount() + print 'errors = ' , errors + print current_thread().getName(), ' , ', 'received = ', received + + if received != message: + print '********** MISSED **************** ', message - received + current = message + + +def connected_test(ch) : + print 'Connected' , ch + +def connected(ch) : + pass + + +''' +pubnub.subscribe({ + 'channel' : 'abcd1', + 'connect' : connected, + 'callback' : message_received +}) +''' +def cb1(): + pubnub.subscribe({ + 'channel' : 'efgh1', + 'connect' : connected, + 'callback' : message_received + }) + +def cb2(): + pubnub.subscribe({ + 'channel' : 'dsm-test', + 'connect' : connected_test, + 'callback' : check_received + }) + +def cb3(): + pubnub.unsubscribe({'channel' : 'efgh1'}) + +def cb4(): + pubnub.unsubscribe({'channel' : 'abcd1'}) + +def subscribe(channel): + pubnub.subscribe({ + 'channel' : channel, + 'connect' : connected, + 'callback' : message_received + }) + + +print threading.activeCount() + + +pubnub.timeout(15,cb1) + +pubnub.timeout(30,cb2) + + +pubnub.timeout(45,cb3) + +pubnub.timeout(60,cb4) + +#''' +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.timeout(x + 5, partial(y,x)) + pubnub.timeout(x + 25, partial(z, x)) + x += 10 +#''' + +''' +for x in range(1,1000): + def cb(r): print r , ' : ', threading.activeCount() + def y(t): + pubnub.publish({ + 'message' : t, + 'callback' : cb, + 'channel' : 'dsm-test' + }) + + + pubnub.timeout(x + 1, partial(y,x)) + x += 1 +''' + + +pubnub.start() diff --git a/python-twisted/unassembled/Platform.py b/python-twisted/unassembled/Platform.py index 3b84b30..5268446 100644 --- a/python-twisted/unassembled/Platform.py +++ b/python-twisted/unassembled/Platform.py @@ -44,6 +44,7 @@ class Pubnub(PubnubCoreAsync): self.headers['User-Agent'] = ['Python-Twisted'] #self.headers['Accept-Encoding'] = [self.accept_encoding] self.headers['V'] = [self.version] + self._channel_list_lock = None def _request( self, request, callback, single=False ) : global pnconn_pool -- cgit v1.2.3 From 150ae1566d813acbb773839e919db2c0f467931c Mon Sep 17 00:00:00 2001 From: Devendra Date: Wed, 16 Apr 2014 00:00:40 +0530 Subject: adding code to support async and pam client capabilities with python v2 and v3 --- python-twisted/Pubnub.py | 325 ++++++++++++++--------------- python-twisted/examples/publish-example.py | 27 ++- python-twisted/unassembled/Platform.py | 67 ++++-- 3 files changed, 233 insertions(+), 186 deletions(-) (limited to 'python-twisted') diff --git a/python-twisted/Pubnub.py b/python-twisted/Pubnub.py index 7171efe..383ee6d 100644 --- a/python-twisted/Pubnub.py +++ b/python-twisted/Pubnub.py @@ -176,12 +176,13 @@ import time import hashlib import uuid import sys -from urllib import quote + +try: from urllib.parse import quote +except: from urllib2 import quote from base64 import urlsafe_b64encode from hashlib import sha256 -from urllib import quote -from urllib import urlopen + import hmac @@ -233,12 +234,11 @@ class PubnubBase(object): 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: self.python_version = 3 self.pc = PubnubCrypto3() - if not isinstance(self.uuid, str): raise AttributeError("pres_uuid must be a string") @@ -357,7 +357,10 @@ class PubnubBase(object): if (callback != None): callback({'message' : response['message'], 'payload' : response['payload']}) else: if (callback != None):callback(response) - if (callback != None): return _new_format_callback + if (callback != None): + return _new_format_callback + else: + return None def publish( self, args ) : @@ -392,23 +395,28 @@ class PubnubBase(object): if 'callback' in args : callback = args['callback'] else : - callback = None + callback = None + + if 'error' in args : + error = args['error'] + else : + error = None - #message = json.dumps(args['message'], separators=(',',':')) message = self.encrypt(args['message']) - signature = self.sign(channel, message) + #signature = self.sign(channel, message) ## Send Message return self._request({"urlcomponents": [ 'publish', self.publish_key, self.subscribe_key, - signature, + '0', channel, '0', message - ], 'urlparams' : {'auth' : self.auth_key}}, self._return_wrapped_callback(callback)) + ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback), + error=self._return_wrapped_callback(error)) def presence( self, args ) : """ @@ -472,12 +480,10 @@ class PubnubBase(object): """ channel = str(args['channel']) - ## Capture Callback - if 'callback' in args : - callback = args['callback'] - else : - callback = 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 : raise Exception('Missing Channel') @@ -488,59 +494,16 @@ class PubnubBase(object): 'v2','presence', 'sub_key', self.subscribe_key, 'channel', channel - ]}, callback); - - - def history( self, args ) : + ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback), + error=self._return_wrapped_callback(error)) + + def history(self, args) : """ #** #* History #* #* Load history from a channel. #* - #* @param array args with 'channel' and 'limit'. - #* @return mixed false on fail, array on success. - #* - - ## History Example - history = pubnub.history({ - 'channel' : 'hello_world', - 'limit' : 1 - }) - print(history) - - """ - ## Capture User Input - limit = 'limit' in args and int(args['limit']) or 10 - channel = str(args['channel']) - - ## Fail if bad input. - if not channel : - raise Exception('Missing Channel') - return False - - ## Capture Callback - if 'callback' in args : - callback = args['callback'] - else : - callback = None - - ## Get History - return self._request({ "urlcomponents" : [ - 'history', - self.subscribe_key, - channel, - '0', - str(limit) - ] }, callback); - - def detailedHistory(self, args) : - """ - #** - #* Detailed History - #* - #* Load Detailed history from a channel. - #* #* @param array args with 'channel', optional: 'start', 'end', 'reverse', 'count' #* @return mixed false on fail, array on success. #* @@ -556,34 +519,21 @@ class PubnubBase(object): ## Capture User Input channel = str(args['channel']) - params = dict() - count = 100 - - if 'count' in args: - count = int(args['count']) - - params['count'] = str(count) - - if 'reverse' in args: - params['reverse'] = str(args['reverse']).lower() + callback = args['callback'] if 'callback' in args else None + error = args['error'] if 'error' in args else None - if 'start' in args: - params['start'] = str(args['start']) + params = dict() - if 'end' in args: - params['end'] = str(args['end']) + 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 - ## Capture Callback - if 'callback' in args : - callback = args['callback'] - else : - callback = None - ## Get History return self._request({ 'urlcomponents' : [ 'v2', @@ -592,7 +542,8 @@ class PubnubBase(object): self.subscribe_key, 'channel', channel, - ],'urlparams' : params }, callback=callback); + ], 'urlparams' : {'auth' : self.auth_key}}, callback=self._return_wrapped_callback(callback), + error=self._return_wrapped_callback(error)) def time(self, args = None) : """ @@ -610,10 +561,9 @@ class PubnubBase(object): """ ## Capture Callback - if args and 'callback' in args: - callback = args['callback'] - else : - callback = None + + callback = callback if args and 'callback' in args else None + time = self._request({'urlcomponents' : [ 'time', '0' @@ -637,7 +587,8 @@ class PubnubBase(object): 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()]) + url = url + '?' + "&".join([ x + "=" + str(y) for x,y in request["urlparams"].items() if y is not None]) + #print(url) return url @@ -648,9 +599,14 @@ except ImportError: import Crypto.Hash.SHA256 as digestmod sha256 = digestmod.new import hmac -import threading -from threading import current_thread -import threading + +class EmptyLock(): + def __enter__(self): + pass + def __exit__(self,a,b,c): + pass + +empty_lock = EmptyLock() class PubnubCoreAsync(PubnubBase): @@ -666,7 +622,9 @@ class PubnubCoreAsync(PubnubBase): auth_key = None, ssl_on = False, origin = 'pubsub.pubnub.com', - uuid = None + uuid = None, + _tt_lock=empty_lock, + _channel_list_lock=empty_lock ) : """ #** @@ -696,29 +654,20 @@ class PubnubCoreAsync(PubnubBase): 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 = threading.RLock() + 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 def get_channel_list(self, channels): channel = '' first = True - if self._channel_list_lock: - with self._channel_list_lock: - for ch in channels: - if not channels[ch]['subscribed']: - continue - if not first: - channel += ',' - else: - first = False - channel += ch - else: + with self._channel_list_lock: for ch in channels: if not channels[ch]['subscribed']: continue @@ -727,9 +676,15 @@ class PubnubCoreAsync(PubnubBase): else: first = False channel += ch - return channel + + def each(l, func): + if func is None: + return + for i in l: + func(i) + def subscribe( self, args=None, sync=False ) : """ #** @@ -765,12 +720,12 @@ 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 + 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 @@ -803,10 +758,15 @@ class PubnubCoreAsync(PubnubBase): chobj['connected'] = True _invoke(chobj['connect'],chobj['name']) - def _invoke_error(err=None): - for ch in self.subscriptions: - chobj = self.subscriptions[ch] - _invoke(chobj.error,err) + 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) + else: + for ch in channel_list: + chobj = self.subscriptions[ch] + _invoke(chobj['error'],err) ''' if callback is None: @@ -827,19 +787,7 @@ class PubnubCoreAsync(PubnubBase): ## New Channel? if not channel in self.subscriptions: - if self._channel_list_lock: - with self._channel_list_lock: - self.subscriptions[channel] = { - 'name' : channel, - 'first' : False, - 'connected' : False, - 'subscribed' : True, - 'callback' : callback, - 'connect' : connect, - 'disconnect' : disconnect, - 'reconnect' : reconnect - } - else: + with self._channel_list_lock: self.subscriptions[channel] = { 'name' : channel, 'first' : False, @@ -848,9 +796,11 @@ class PubnubCoreAsync(PubnubBase): 'callback' : callback, 'connect' : connect, 'disconnect' : disconnect, - 'reconnect' : reconnect + '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") @@ -865,8 +815,11 @@ class PubnubCoreAsync(PubnubBase): def sub_callback(response): ## ERROR ? - if not response or error in response: - _invoke_error() + #print response + if not response or ('message' in response and response['message'] == 'Forbidden'): + _invoke_error(response['payload']['channels'], response['message']) + _connect() + return _invoke_connect() @@ -893,7 +846,6 @@ class PubnubCoreAsync(PubnubBase): _connect() - channel_list = self.get_channel_list(self.subscriptions) ## CONNECT TO PUBNUB SUBSCRIBE SERVERS try: @@ -903,9 +855,9 @@ class PubnubCoreAsync(PubnubBase): channel_list, '0', str(self.timetoken) - ], "urlparams" : {"uuid":self.uuid} }, sub_callback, single=True ) + ], "urlparams" : {"uuid":self.uuid, "auth" : self.auth_key} }, sub_callback, sub_callback, single=True ) except Exception as e: - print e + print(e) self.timeout( 1, _connect) return @@ -926,16 +878,20 @@ class PubnubCoreAsync(PubnubBase): def unsubscribe( self, args ): - #print(args['channel']) - channel = str(args['channel']) - if not (channel in self.subscriptions): + + if 'channel' in self.subscriptions is False: return False + channel = str(args['channel']) + + ## DISCONNECT - self.subscriptions[channel]['connected'] = 0 - self.subscriptions[channel]['subscribed'] = False - self.subscriptions[channel]['timetoken'] = 0 - self.subscriptions[channel]['first'] = False + 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.CONNECT() @@ -951,6 +907,9 @@ from twisted.internet.task import LoopingCall import twisted from hashlib import sha256 import time +import json +from twisted.python.compat import ( + _PY3, unicode, intToBytes, networkString, nativeString) pnconn_pool = HTTPConnectionPool(reactor, persistent=True) pnconn_pool.maxPersistentPerHost = 100000 @@ -968,8 +927,9 @@ class Pubnub(PubnubCoreAsync): self, publish_key, subscribe_key, - secret_key = False, - cipher_key = False, + secret_key=False, + cipher_key=False, + auth_key=None, ssl_on = False, origin = 'pubsub.pubnub.com' ) : @@ -978,6 +938,7 @@ class Pubnub(PubnubCoreAsync): subscribe_key=subscribe_key, secret_key=secret_key, cipher_key=cipher_key, + auth_key=auth_key, ssl_on=ssl_on, origin=origin, ) @@ -985,11 +946,14 @@ class Pubnub(PubnubCoreAsync): self.headers['User-Agent'] = ['Python-Twisted'] #self.headers['Accept-Encoding'] = [self.accept_encoding] self.headers['V'] = [self.version] - self._channel_list_lock = None - def _request( self, request, callback, single=False ) : + def _request( self, request, callback=None, error=None, single=False ) : global pnconn_pool + def _invoke(func, data): + if func is not None: + func(data) + ## Build URL ''' url = self.origin + '/' + "/".join([ @@ -1006,7 +970,12 @@ class Pubnub(PubnubCoreAsync): pool = self.ssl and None or pnconn_pool )), [('gzip', GzipDecoder)]) - request = agent.request( 'GET', url, Headers(self.headers), None ) + try: + 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 ) + if single is True: id = time.time() @@ -1014,35 +983,65 @@ class Pubnub(PubnubCoreAsync): def received(response): finished = Deferred() - response.deliverBody(PubNubResponse(finished)) + if response.code == 403: + response.deliverBody(PubNub403Response(finished)) + else: + response.deliverBody(PubNubResponse(finished)) + + return finished + + def error_handler(response): + finished = Deferred() + if response.code == 403: + response.deliverBody(PubNub403Response(finished)) + else: + response.deliverBody(PubNubResponse(finished)) + return finished def complete(data): if single is True: - if not id == self.id: + if id != self.id: return None try: - callback(eval(data)) + data = json.loads(data) except Exception as e: - pass - #need error handling here + try: + data = json.loads(data.decode("utf-8")) + except: + _invoke(error, {'error' : 'json decode error'}) + + if 'error' in data and 'status' in data and 'status' != 200: + _invoke(error, data) + else: + _invoke(callback, data) def abort(): pass request.addCallback(received) - request.addBoth(complete) + request.addCallback(complete) + request.addErrback(error_handler) return abort class WebClientContextFactory(ClientContextFactory): def getContext(self, hostname, port): return ClientContextFactory.getContext(self) + +class PubNub403Response(Protocol): + def __init__( self, finished ): + self.finished = finished + + def dataReceived( self, bytes ): + #print '403 resp ', bytes + self.finished.callback(bytes) class PubNubResponse(Protocol): def __init__( self, finished ): self.finished = finished def dataReceived( self, bytes ): - self.finished.callback(bytes) + #print bytes + self.finished.callback(bytes) diff --git a/python-twisted/examples/publish-example.py b/python-twisted/examples/publish-example.py index d09ad8d..d15b21b 100644 --- a/python-twisted/examples/publish-example.py +++ b/python-twisted/examples/publish-example.py @@ -19,12 +19,13 @@ 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 +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, ssl_on ) +pubnub = Pubnub( publish_key, subscribe_key, secret_key, cipher_key, auth_key, ssl_on ) crazy = 'hello_world' ## ----------------------------------------------------------------------- @@ -33,32 +34,36 @@ crazy = 'hello_world' def publish_complete(info): print(info) +def publish_error(info): + print('ERROR : ' + str(info)) + ## Publish string pubnub.publish({ 'channel' : crazy, 'message' : 'Hello World!', - 'callback' : publish_complete + 'callback' : publish_complete, + 'error' : publish_error }) ## Publish list li = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] + pubnub.publish({ 'channel' : crazy, 'message' : li, - 'callback' : publish_complete + 'callback' : publish_complete, + 'error' : publish_error }) def done_cb(info): publish_complete(info) - reactor.stop() -## Publish Dictionary Object + pubnub.publish({ 'channel' : crazy, 'message' : { 'some_key' : 'some_val' }, - 'callback' : done_cb + 'callback' : done_cb, + 'error' : publish_error }) -## ----------------------------------------------------------------------- -## IO Event Loop -## ----------------------------------------------------------------------- -reactor.run() + +pubnub.start() diff --git a/python-twisted/unassembled/Platform.py b/python-twisted/unassembled/Platform.py index 5268446..c7fe5cd 100644 --- a/python-twisted/unassembled/Platform.py +++ b/python-twisted/unassembled/Platform.py @@ -10,6 +10,9 @@ from twisted.internet.task import LoopingCall import twisted from hashlib import sha256 import time +import json +from twisted.python.compat import ( + _PY3, unicode, intToBytes, networkString, nativeString) pnconn_pool = HTTPConnectionPool(reactor, persistent=True) pnconn_pool.maxPersistentPerHost = 100000 @@ -27,8 +30,9 @@ class Pubnub(PubnubCoreAsync): self, publish_key, subscribe_key, - secret_key = False, - cipher_key = False, + secret_key=False, + cipher_key=False, + auth_key=None, ssl_on = False, origin = 'pubsub.pubnub.com' ) : @@ -37,6 +41,7 @@ class Pubnub(PubnubCoreAsync): subscribe_key=subscribe_key, secret_key=secret_key, cipher_key=cipher_key, + auth_key=auth_key, ssl_on=ssl_on, origin=origin, ) @@ -44,11 +49,14 @@ class Pubnub(PubnubCoreAsync): self.headers['User-Agent'] = ['Python-Twisted'] #self.headers['Accept-Encoding'] = [self.accept_encoding] self.headers['V'] = [self.version] - self._channel_list_lock = None - def _request( self, request, callback, single=False ) : + def _request( self, request, callback=None, error=None, single=False ) : global pnconn_pool + def _invoke(func, data): + if func is not None: + func(data) + ## Build URL ''' url = self.origin + '/' + "/".join([ @@ -65,7 +73,12 @@ class Pubnub(PubnubCoreAsync): pool = self.ssl and None or pnconn_pool )), [('gzip', GzipDecoder)]) - request = agent.request( 'GET', url, Headers(self.headers), None ) + try: + 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 ) + if single is True: id = time.time() @@ -73,35 +86,65 @@ class Pubnub(PubnubCoreAsync): def received(response): finished = Deferred() - response.deliverBody(PubNubResponse(finished)) + if response.code == 403: + response.deliverBody(PubNub403Response(finished)) + else: + response.deliverBody(PubNubResponse(finished)) + + return finished + + def error_handler(response): + finished = Deferred() + if response.code == 403: + response.deliverBody(PubNub403Response(finished)) + else: + response.deliverBody(PubNubResponse(finished)) + return finished def complete(data): if single is True: - if not id == self.id: + if id != self.id: return None try: - callback(eval(data)) + data = json.loads(data) except Exception as e: - pass - #need error handling here + try: + data = json.loads(data.decode("utf-8")) + except: + _invoke(error, {'error' : 'json decode error'}) + + if 'error' in data and 'status' in data and 'status' != 200: + _invoke(error, data) + else: + _invoke(callback, data) def abort(): pass request.addCallback(received) - request.addBoth(complete) + request.addCallback(complete) + request.addErrback(error_handler) return abort class WebClientContextFactory(ClientContextFactory): def getContext(self, hostname, port): return ClientContextFactory.getContext(self) + +class PubNub403Response(Protocol): + def __init__( self, finished ): + self.finished = finished + + def dataReceived( self, bytes ): + #print '403 resp ', bytes + self.finished.callback(bytes) class PubNubResponse(Protocol): def __init__( self, finished ): self.finished = finished def dataReceived( self, bytes ): - self.finished.callback(bytes) + #print bytes + self.finished.callback(bytes) -- cgit v1.2.3 From 9dc2555746adf717da0db808f4096af2167a1580 Mon Sep 17 00:00:00 2001 From: Devendra Date: Thu, 17 Apr 2014 00:28:05 +0530 Subject: adding ver 1 of dev console --- python-twisted/Pubnub.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'python-twisted') diff --git a/python-twisted/Pubnub.py b/python-twisted/Pubnub.py index 383ee6d..b9e6b52 100644 --- a/python-twisted/Pubnub.py +++ b/python-twisted/Pubnub.py @@ -291,7 +291,7 @@ class PubnubBase(object): params=params ) - signature = self._pam_sign(sign_input) + query['signature'] = self._pam_sign(sign_input) ''' url = ("https://pubsub.pubnub.com/v1/auth/{apitype}/sub-key/".format(apitype="audit" if (apicode) else "grant") + @@ -304,7 +304,7 @@ class PubnubBase(object): 'v1', 'auth', "audit" if (apicode) else "grant" , 'sub-key', self.subscribe_key - ], 'urlparams' : {'auth' : self.auth_key, 'signature' : signature}}, + ], 'urlparams' : query}, self._return_wrapped_callback(callback)) def grant( self, channel, authkey=False, read=True, write=True, ttl=5, callback=None): -- cgit v1.2.3 From 5d6a3e1356182663b03d62f9258d38459d49017e Mon Sep 17 00:00:00 2001 From: Devendra Date: Fri, 18 Apr 2014 01:23:19 +0530 Subject: fixing wrong version detection with python 2.7 --- python-twisted/Pubnub.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'python-twisted') diff --git a/python-twisted/Pubnub.py b/python-twisted/Pubnub.py index b9e6b52..99eda47 100644 --- a/python-twisted/Pubnub.py +++ b/python-twisted/Pubnub.py @@ -237,8 +237,12 @@ class PubnubBase(object): self.python_version = 2 self.pc = PubnubCrypto2() else: - self.python_version = 3 - self.pc = PubnubCrypto3() + if sys.version_info.major == 2: + self.python_version = 2 + self.pc = PubnubCrypto2() + else: + self.python_version = 3 + self.pc = PubnubCrypto3() if not isinstance(self.uuid, str): raise AttributeError("pres_uuid must be a string") @@ -318,14 +322,14 @@ class PubnubBase(object): "ttl" : ttl }, callback=callback) - def revoke( self, channel, authkey=False, read=False, write=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" : read and 1 or 0, - "w" : write and 1 or 0, + "r" : 0, + "w" : 0, "ttl" : ttl }, callback=callback) -- cgit v1.2.3 From 4926061ebebbc060d14feac9c9d6b13880205724 Mon Sep 17 00:00:00 2001 From: Devendra Date: Tue, 22 Apr 2014 23:12:05 +0530 Subject: improvements to dev console --- python-twisted/Pubnub.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) (limited to 'python-twisted') diff --git a/python-twisted/Pubnub.py b/python-twisted/Pubnub.py index 99eda47..22d647b 100644 --- a/python-twisted/Pubnub.py +++ b/python-twisted/Pubnub.py @@ -592,7 +592,6 @@ class PubnubBase(object): ]) 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]) - #print(url) return url @@ -682,6 +681,15 @@ class PubnubCoreAsync(PubnubBase): channel += ch return channel + def get_channel_array(self): + channels = self.subscriptions + channel = [] + with self._channel_list_lock: + for ch in channels: + if not channels[ch]['subscribed']: + continue + channel.append(ch) + return channel def each(l, func): if func is None: @@ -790,7 +798,7 @@ class PubnubCoreAsync(PubnubBase): ## New Channel? - if not channel in self.subscriptions: + if not channel in self.subscriptions or self.subscriptions[channel]['subscribed'] is False: with self._channel_list_lock: self.subscriptions[channel] = { 'name' : channel, @@ -819,7 +827,6 @@ class PubnubCoreAsync(PubnubBase): def sub_callback(response): ## ERROR ? - #print response if not response or ('message' in response and response['message'] == 'Forbidden'): _invoke_error(response['payload']['channels'], response['message']) _connect() @@ -828,9 +835,7 @@ class PubnubCoreAsync(PubnubBase): _invoke_connect() with self._tt_lock: - #print 'A tt : ', self.timetoken , ' last tt : ' , self.last_timetoken self.timetoken = self.last_timetoken if self.timetoken == 0 and self.last_timetoken != 0 else response[1] - #print 'B tt : ', self.timetoken , ' last tt : ' , self.last_timetoken if len(response) > 2: channel_list = response[2].split(',') response_list = response[0] @@ -845,12 +850,13 @@ class PubnubCoreAsync(PubnubBase): if chobj: _invoke(chobj['callback'], self.decrypt(r)) - #with self._tt_lock: - # self.timetoken = self.last_timetoken if self.timetoken == 0 and self.last_timetoken != 0 else response[1] _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" : [ @@ -867,7 +873,6 @@ class PubnubCoreAsync(PubnubBase): self._connect = _connect - ## BEGIN SUBSCRIPTION (LISTEN FOR MESSAGES) _connect() -- cgit v1.2.3 From b2f1e0ed2337b61073a595eaf36afd718a21a3fe Mon Sep 17 00:00:00 2001 From: Devendra Date: Wed, 23 Apr 2014 02:10:55 +0530 Subject: fixing issues reported by Dara in dev console --- python-twisted/Pubnub.py | 1 + 1 file changed, 1 insertion(+) (limited to 'python-twisted') diff --git a/python-twisted/Pubnub.py b/python-twisted/Pubnub.py index 22d647b..f5259ac 100644 --- a/python-twisted/Pubnub.py +++ b/python-twisted/Pubnub.py @@ -666,6 +666,7 @@ class PubnubCoreAsync(PubnubBase): 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 = '' -- cgit v1.2.3 From 09cd0c015ae276aa849297a6a976065b2b3f247b Mon Sep 17 00:00:00 2001 From: Devendra Date: Wed, 23 Apr 2014 14:03:13 +0530 Subject: modifying code for pep 8 compliance --- python-twisted/Pubnub.py | 576 +++++++++++++-------------- python-twisted/examples/here-now-example.py | 22 +- python-twisted/examples/history-example.py | 24 +- python-twisted/examples/publish-example.py | 52 ++- python-twisted/examples/subscribe-example.py | 25 +- python-twisted/examples/uuid-example.py | 4 +- python-twisted/tests/delivery.py | 140 ++++--- python-twisted/tests/subscribe-test.py | 86 ++-- python-twisted/tests/unit-test-full.py | 177 ++++---- python-twisted/tests/unit-tests.py | 148 +++---- python-twisted/unassembled/Platform.py | 57 +-- 11 files changed, 660 insertions(+), 651 deletions(-) (limited to 'python-twisted') 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) - -- cgit v1.2.3 From f7b89bfafae34fa22509c1d1c59d1284ec62c5df Mon Sep 17 00:00:00 2001 From: Devendra Date: Wed, 23 Apr 2014 21:35:06 +0530 Subject: exception handling changes --- python-twisted/Pubnub.py | 74 +++++++++++------------------ python-twisted/examples/here-now-example.py | 13 +++-- python-twisted/unassembled/Platform.py | 37 +++++---------- 3 files changed, 47 insertions(+), 77 deletions(-) (limited to 'python-twisted') diff --git a/python-twisted/Pubnub.py b/python-twisted/Pubnub.py index c312033..94d2624 100644 --- a/python-twisted/Pubnub.py +++ b/python-twisted/Pubnub.py @@ -186,7 +186,7 @@ import sys try: from urllib.parse import quote -except: +except ImportError: from urllib2 import quote from base64 import urlsafe_b64encode @@ -397,7 +397,7 @@ class PubnubBase(object): """ - message = self.encrypt(args['message']) + message = self.encrypt(message) ## Send Message return self._request({"urlcomponents": [ @@ -458,15 +458,6 @@ class PubnubBase(object): print(here_now['uuids']) """ - channel = str(args['channel']) - - 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: - raise Exception('Missing Channel') - return False ## Get Presence Here Now return self._request({"urlcomponents": [ @@ -807,21 +798,23 @@ class PubnubCoreAsync(PubnubBase): return ## CONNECT TO PUBNUB SUBSCRIBE SERVERS - try: - 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) + #try: + 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) + ''' except Exception as e: print(e) self.timeout(1, _connect) return + ''' self._connect = _connect @@ -866,6 +859,10 @@ import twisted from hashlib import sha256 import time import json + +import traceback + + from twisted.python.compat import ( _PY3, unicode, intToBytes, networkString, nativeString) @@ -918,13 +915,7 @@ class Pubnub(PubnubCoreAsync): func(data) ## 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]) - ''' + url = self.getUrl(request) agent = ContentDecoderAgent(RedirectAgent(Agent( @@ -937,7 +928,6 @@ class Pubnub(PubnubCoreAsync): 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) @@ -946,18 +936,13 @@ class Pubnub(PubnubCoreAsync): self.id = id def received(response): - finished = Deferred() - if response.code == 403: - response.deliverBody(PubNub403Response(finished)) - else: - response.deliverBody(PubNubResponse(finished)) - - return finished + if not isinstance(response, twisted.web._newclient.Response): + _invoke(error, {"message": "Not Found"}) + return - def error_handler(response): finished = Deferred() - if response.code == 403: - response.deliverBody(PubNub403Response(finished)) + if response.code in [401, 403]: + response.deliverBody(PubNubPamResponse(finished)) else: response.deliverBody(PubNubResponse(finished)) @@ -969,10 +954,10 @@ class Pubnub(PubnubCoreAsync): return None try: data = json.loads(data) - except Exception as e: + except ValueError as e: try: data = json.loads(data.decode("utf-8")) - except: + except ValueError as e: _invoke(error, {'error': 'json decode error'}) if 'error' in data and 'status' in data and 'status' != 200: @@ -985,7 +970,6 @@ class Pubnub(PubnubCoreAsync): request.addCallback(received) request.addCallback(complete) - request.addErrback(error_handler) return abort @@ -995,12 +979,11 @@ class WebClientContextFactory(ClientContextFactory): return ClientContextFactory.getContext(self) -class PubNub403Response(Protocol): +class PubNubPamResponse(Protocol): def __init__(self, finished): self.finished = finished def dataReceived(self, bytes): - #print '403 resp ', bytes self.finished.callback(bytes) @@ -1009,5 +992,4 @@ class PubNubResponse(Protocol): self.finished = finished 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 bba7d21..14f45c4 100644 --- a/python-twisted/examples/here-now-example.py +++ b/python-twisted/examples/here-now-example.py @@ -10,7 +10,8 @@ ## ----------------------------------- import sys -from twisted.internet import reactor +sys.path.append('..') +sys.path.append('../../common') from Pubnub import Pubnub publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo' @@ -32,14 +33,12 @@ crazy = 'hello_world' def here_now_complete(messages): print(messages) - reactor.stop() + pubnub.stop() -pubnub.here_now({ - 'channel': crazy, - 'callback': here_now_complete -}) +pubnub.here_now( + channel=crazy, callback=here_now_complete, error=here_now_complete) ## ----------------------------------------------------------------------- ## IO Event Loop ## ----------------------------------------------------------------------- -reactor.run() +pubnub.start() diff --git a/python-twisted/unassembled/Platform.py b/python-twisted/unassembled/Platform.py index d6d91ac..a9e811b 100644 --- a/python-twisted/unassembled/Platform.py +++ b/python-twisted/unassembled/Platform.py @@ -12,6 +12,10 @@ import twisted from hashlib import sha256 import time import json + +import traceback + + from twisted.python.compat import ( _PY3, unicode, intToBytes, networkString, nativeString) @@ -64,13 +68,7 @@ class Pubnub(PubnubCoreAsync): func(data) ## 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]) - ''' + url = self.getUrl(request) agent = ContentDecoderAgent(RedirectAgent(Agent( @@ -83,7 +81,6 @@ class Pubnub(PubnubCoreAsync): 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) @@ -92,18 +89,13 @@ class Pubnub(PubnubCoreAsync): self.id = id def received(response): - finished = Deferred() - if response.code == 403: - response.deliverBody(PubNub403Response(finished)) - else: - response.deliverBody(PubNubResponse(finished)) - - return finished + if not isinstance(response, twisted.web._newclient.Response): + _invoke(error, {"message": "Not Found"}) + return - def error_handler(response): finished = Deferred() - if response.code == 403: - response.deliverBody(PubNub403Response(finished)) + if response.code in [401, 403]: + response.deliverBody(PubNubPamResponse(finished)) else: response.deliverBody(PubNubResponse(finished)) @@ -115,10 +107,10 @@ class Pubnub(PubnubCoreAsync): return None try: data = json.loads(data) - except Exception as e: + except ValueError as e: try: data = json.loads(data.decode("utf-8")) - except: + except ValueError as e: _invoke(error, {'error': 'json decode error'}) if 'error' in data and 'status' in data and 'status' != 200: @@ -131,7 +123,6 @@ class Pubnub(PubnubCoreAsync): request.addCallback(received) request.addCallback(complete) - request.addErrback(error_handler) return abort @@ -141,12 +132,11 @@ class WebClientContextFactory(ClientContextFactory): return ClientContextFactory.getContext(self) -class PubNub403Response(Protocol): +class PubNubPamResponse(Protocol): def __init__(self, finished): self.finished = finished def dataReceived(self, bytes): - #print '403 resp ', bytes self.finished.callback(bytes) @@ -155,5 +145,4 @@ class PubNubResponse(Protocol): self.finished = finished def dataReceived(self, bytes): - #print bytes self.finished.callback(bytes) -- cgit v1.2.3 From 493e29a108255eb3ae3166dc920f40e2f4e5c4c4 Mon Sep 17 00:00:00 2001 From: Devendra Date: Thu, 24 Apr 2014 00:16:57 +0530 Subject: adding single file for all platforms --- python-twisted/Pubnub.py | 7 +++---- python-twisted/unassembled/Platform.py | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) (limited to 'python-twisted') diff --git a/python-twisted/Pubnub.py b/python-twisted/Pubnub.py index 94d2624..efbbfd9 100644 --- a/python-twisted/Pubnub.py +++ b/python-twisted/Pubnub.py @@ -868,10 +868,9 @@ from twisted.python.compat import ( pnconn_pool = HTTPConnectionPool(reactor, persistent=True) pnconn_pool.maxPersistentPerHost = 100000 -pnconn_pool.cachedConnectionTimeout = 310 +pnconn_pool.cachedConnectionTimeout = 15 pnconn_pool.retryAutomatically = True - class Pubnub(PubnubCoreAsync): def start(self): @@ -937,11 +936,11 @@ class Pubnub(PubnubCoreAsync): def received(response): if not isinstance(response, twisted.web._newclient.Response): - _invoke(error, {"message": "Not Found"}) + _invoke(error, {"message" : "Not Found"}) return finished = Deferred() - if response.code in [401, 403]: + if response.code in [401,403]: response.deliverBody(PubNubPamResponse(finished)) else: response.deliverBody(PubNubResponse(finished)) diff --git a/python-twisted/unassembled/Platform.py b/python-twisted/unassembled/Platform.py index a9e811b..b220257 100644 --- a/python-twisted/unassembled/Platform.py +++ b/python-twisted/unassembled/Platform.py @@ -21,10 +21,9 @@ from twisted.python.compat import ( pnconn_pool = HTTPConnectionPool(reactor, persistent=True) pnconn_pool.maxPersistentPerHost = 100000 -pnconn_pool.cachedConnectionTimeout = 310 +pnconn_pool.cachedConnectionTimeout = 15 pnconn_pool.retryAutomatically = True - class Pubnub(PubnubCoreAsync): def start(self): @@ -90,11 +89,11 @@ class Pubnub(PubnubCoreAsync): def received(response): if not isinstance(response, twisted.web._newclient.Response): - _invoke(error, {"message": "Not Found"}) + _invoke(error, {"message" : "Not Found"}) return finished = Deferred() - if response.code in [401, 403]: + if response.code in [401,403]: response.deliverBody(PubNubPamResponse(finished)) else: response.deliverBody(PubNubResponse(finished)) -- cgit v1.2.3 From 93379625e26c98a8cfab72c106ae40819843f956 Mon Sep 17 00:00:00 2001 From: Devendra Date: Thu, 24 Apr 2014 00:35:10 +0530 Subject: remove relative imports --- python-twisted/examples/here-now-example.py | 2 -- python-twisted/examples/history-example.py | 1 - python-twisted/examples/publish-example.py | 2 -- python-twisted/examples/subscribe-example.py | 1 - python-twisted/examples/uuid-example.py | 1 - python-twisted/tests/benchmark.py | 1 - python-twisted/tests/delivery.py | 1 - python-twisted/tests/subscribe-test.py | 1 - python-twisted/tests/unit-test-full.py | 3 --- python-twisted/tests/unit-tests.py | 4 ---- 10 files changed, 17 deletions(-) (limited to 'python-twisted') diff --git a/python-twisted/examples/here-now-example.py b/python-twisted/examples/here-now-example.py index 14f45c4..0f34f36 100644 --- a/python-twisted/examples/here-now-example.py +++ b/python-twisted/examples/here-now-example.py @@ -10,8 +10,6 @@ ## ----------------------------------- import sys -sys.path.append('..') -sys.path.append('../../common') from Pubnub import Pubnub publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo' diff --git a/python-twisted/examples/history-example.py b/python-twisted/examples/history-example.py index f128cd7..72c7445 100644 --- a/python-twisted/examples/history-example.py +++ b/python-twisted/examples/history-example.py @@ -11,7 +11,6 @@ import sys from twisted.internet import reactor -sys.path.append('../') from Pubnub import Pubnub publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo' diff --git a/python-twisted/examples/publish-example.py b/python-twisted/examples/publish-example.py index 6b5b19a..5d6cc29 100644 --- a/python-twisted/examples/publish-example.py +++ b/python-twisted/examples/publish-example.py @@ -11,8 +11,6 @@ import sys from twisted.internet import reactor -sys.path.append('../') -sys.path.append('../../') from Pubnub import Pubnub publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo' diff --git a/python-twisted/examples/subscribe-example.py b/python-twisted/examples/subscribe-example.py index 168a2d2..b261b0d 100644 --- a/python-twisted/examples/subscribe-example.py +++ b/python-twisted/examples/subscribe-example.py @@ -11,7 +11,6 @@ import sys from twisted.internet import reactor -sys.path.append('../') from Pubnub import Pubnub publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo' diff --git a/python-twisted/examples/uuid-example.py b/python-twisted/examples/uuid-example.py index 581051b..840f48c 100644 --- a/python-twisted/examples/uuid-example.py +++ b/python-twisted/examples/uuid-example.py @@ -11,7 +11,6 @@ import sys from twisted.internet import reactor -sys.path.append('../') from Pubnub import Pubnub ## ----------------------------------------------------------------------- diff --git a/python-twisted/tests/benchmark.py b/python-twisted/tests/benchmark.py index d4d6d80..0e7b809 100644 --- a/python-twisted/tests/benchmark.py +++ b/python-twisted/tests/benchmark.py @@ -12,7 +12,6 @@ import sys import datetime from twisted.internet import reactor -sys.path.append('../') from Pubnub import Pubnub publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo' diff --git a/python-twisted/tests/delivery.py b/python-twisted/tests/delivery.py index 3ba221b..d36e895 100644 --- a/python-twisted/tests/delivery.py +++ b/python-twisted/tests/delivery.py @@ -14,7 +14,6 @@ import datetime import time import math -sys.path.append('../') from Pubnub import Pubnub ## ----------------------------------------------------------------------- diff --git a/python-twisted/tests/subscribe-test.py b/python-twisted/tests/subscribe-test.py index 6ff4a35..aca63ba 100755 --- a/python-twisted/tests/subscribe-test.py +++ b/python-twisted/tests/subscribe-test.py @@ -10,7 +10,6 @@ ## ----------------------------------- import sys -sys.path.append('../') import datetime from Pubnub import Pubnub from functools import partial diff --git a/python-twisted/tests/unit-test-full.py b/python-twisted/tests/unit-test-full.py index f8be1cc..374772f 100644 --- a/python-twisted/tests/unit-test-full.py +++ b/python-twisted/tests/unit-test-full.py @@ -18,9 +18,6 @@ ## ----------------------------------- import sys -sys.path.append('../') -sys.path.append('./') -sys.path.append('../common/') from Pubnub import Pubnub publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo' diff --git a/python-twisted/tests/unit-tests.py b/python-twisted/tests/unit-tests.py index d0e5722..169e1f1 100644 --- a/python-twisted/tests/unit-tests.py +++ b/python-twisted/tests/unit-tests.py @@ -2,10 +2,6 @@ import sys import time -sys.path.append('../../common') -sys.path.append('../common') -sys.path.append('..') -sys.path.append('.') from PubnubUnitTest import Suite from Pubnub import Pubnub -- cgit v1.2.3 From c5d2fb446378e78e9e164dbea969edd57314dc4b Mon Sep 17 00:00:00 2001 From: Devendra Date: Thu, 24 Apr 2014 00:59:50 +0530 Subject: removing files --- python-twisted/Makefile | 28 - python-twisted/Pubnub.py | 994 --------------------------------- python-twisted/unassembled/Platform.py | 147 ----- 3 files changed, 1169 deletions(-) delete mode 100644 python-twisted/Makefile delete mode 100644 python-twisted/Pubnub.py delete mode 100644 python-twisted/unassembled/Platform.py (limited to 'python-twisted') diff --git a/python-twisted/Makefile b/python-twisted/Makefile deleted file mode 100644 index bf23137..0000000 --- a/python-twisted/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -include ../Makefile.inc - - -.PHONY: all -all: build - -.PHONY: build -build: - cat ../common/LICENSE_HEADER > ./Pubnub.py - echo "\n" >> ./Pubnub.py - cat ../common/PubnubCrypto.py >> ./Pubnub.py - echo "\n" >> ./Pubnub.py - cat ../common/PubnubBase.py >> ./Pubnub.py - echo "\n" >> ./Pubnub.py - cat ../common/PubnubCoreAsync.py >> ./Pubnub.py - echo "\n" >> ./Pubnub.py - cat ./unassembled/Platform.py >> ./Pubnub.py - find -name "Pubnub*py" | xargs sed -i "s/PubNub\ [0-9]\.[0-9]\.[0-9]/PubNub\ $(VERSION)/g" - - -.PHONY: clean -clean: - rm -f Pubnub.py* - -.PHONY: test -test: - python tests/unit-tests.py - diff --git a/python-twisted/Pubnub.py b/python-twisted/Pubnub.py deleted file mode 100644 index efbbfd9..0000000 --- a/python-twisted/Pubnub.py +++ /dev/null @@ -1,994 +0,0 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud. -# coding=utf8 - -## PubNub Real-time Push APIs and Notifications Framework -## Copyright (c) 2010 Stephen Blum -## http://www.pubnub.com/ - -## ----------------------------------- -## PubNub 3.3.5 Real-time Push Cloud API -## ----------------------------------- - - -from Crypto.Cipher import AES -from Crypto.Hash import MD5 -from base64 import encodestring, decodestring -import hashlib -import hmac - - -class PubnubCrypto2(): - """ - #** - #* PubnubCrypto - #* - #** - - ## Initiate Class - pc = PubnubCrypto - - """ - - def pad(self, msg, block_size=16): - """ - #** - #* pad - #* - #* pad the text to be encrypted - #* appends a padding character to the end of the String - #* until the string has block_size length - #* @return msg with padding. - #** - """ - padding = block_size - (len(msg) % block_size) - return msg + chr(padding) * padding - - def depad(self, msg): - """ - #** - #* depad - #* - #* depad the decryptet message" - #* @return msg without padding. - #** - """ - return msg[0:-ord(msg[-1])] - - def getSecret(self, key): - """ - #** - #* getSecret - #* - #* hases the key to MD5 - #* @return key in MD5 format - #** - """ - return hashlib.sha256(key).hexdigest() - - def encrypt(self, key, msg): - """ - #** - #* encrypt - #* - #* encrypts the message - #* @return message in encrypted format - #** - """ - secret = self.getSecret(key) - 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): - """ - #** - #* decrypt - #* - #* decrypts the message - #* @return message in decryped format - #** - """ - secret = self.getSecret(key) - Initial16bytes = '0123456789012345' - cipher = AES.new(secret[0:32], AES.MODE_CBC, Initial16bytes) - return self.depad((cipher.decrypt(decodestring(msg)))) - - -class PubnubCrypto3(): - """ - #** - #* PubnubCrypto - #* - #** - - ## Initiate Class - pc = PubnubCrypto - - """ - - def pad(self, msg, block_size=16): - """ - #** - #* pad - #* - #* pad the text to be encrypted - #* appends a padding character to the end of the String - #* until the string has block_size length - #* @return msg with padding. - #** - """ - padding = block_size - (len(msg) % block_size) - return msg + (chr(padding) * padding).encode('utf-8') - - def depad(self, msg): - """ - #** - #* depad - #* - #* depad the decryptet message" - #* @return msg without padding. - #** - """ - return msg[0:-ord(msg[-1])] - - def getSecret(self, key): - """ - #** - #* getSecret - #* - #* hases the key to MD5 - #* @return key in MD5 format - #** - """ - return hashlib.sha256(key.encode("utf-8")).hexdigest() - - def encrypt(self, key, msg): - """ - #** - #* encrypt - #* - #* encrypts the message - #* @return message in encrypted format - #** - """ - 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): - """ - #** - #* decrypt - #* - #* decrypts the message - #* @return message in decryped format - #** - """ - 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') - - -try: - import json -except ImportError: - import simplejson as json - -import time -import hashlib -import uuid -import sys - -try: - from urllib.parse import quote -except ImportError: - from urllib2 import quote - -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 - ): - """ - #** - #* Pubnub - #* - #* Init the Pubnub Client API - #* - #* @param string publish_key required key to send messages. - #* @param string subscribe_key required key to receive messages. - #* @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) - #** - - ## Initiat Class - pubnub = Pubnub( 'PUBLISH-KEY', 'SUBSCRIBE-KEY', 'SECRET-KEY', False ) - - """ - 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 - - if self.ssl: - self.origin = 'https://' + 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() - else: - if sys.version_info.major == 2: - self.python_version = 2 - self.pc = PubnubCrypto2() - else: - self.python_version = 3 - self.pc = PubnubCrypto3() - - if not isinstance(self.uuid, str): - raise AttributeError("pres_uuid must be a string") - - ''' - - def _sign(self, channel, message): - ## Sign Message - if self.secret_key: - signature = hashlib.md5('/'.join([ - self.publish_key, - self.subscribe_key, - self.secret_key, - channel, - message - ])).hexdigest() - else: - signature = '0' - return signature - ''' - - def _pam_sign(self, msg): - """Calculate a signature by secret key and message.""" - - return urlsafe_b64encode(hmac.new( - self.secret_key.encode("utf-8"), - msg.encode("utf-8"), - sha256 - ).digest()) - - def _pam_auth(self, query, apicode=0, callback=None): - """Issue an authenticated request.""" - - if 'timestamp' not in query: - query['timestamp'] = int(time.time()) - - ## Global Grant? - if 'auth' in query and not query['auth']: - del query['auth'] - - if 'channel' in query and not query['channel']: - del query['channel'] - - params = "&".join([ - x + "=" + quote( - str(query[x]), safe="" - ) for x in sorted(query) - ]) - sign_input = "{subkey}\n{pubkey}\n{apitype}\n{params}".format( - subkey=self.subscribe_key, - pubkey=self.publish_key, - apitype="audit" if (apicode) else "grant", - params=params - ) - - query['signature'] = self._pam_sign(sign_input) - - return self._request({"urlcomponents": [ - 'v1', 'auth', "audit" if (apicode) else "grant", - 'sub-key', - self.subscribe_key - ], 'urlparams': query}, - self._return_wrapped_callback(callback)) - - 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 - }, callback=callback) - - 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 - }, callback=callback) - - def audit(self, channel=False, authkey=False, callback=None): - return self._pam_auth({ - "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(message) - - return message - - def decrypt(self, message): - if self.cipher_key: - message = self.pc.decrypt(self.cipher_key, message) - - return message - - def _return_wrapped_callback(self, callback=None): - def _new_format_callback(response): - if 'payload' in response: - if (callback is not None): - callback({'message': response['message'], - 'payload': response['payload']}) - else: - 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): - """ - #** - #* Publish - #* - #* Send a message to a channel. - #* - #* @param array args with channel and message. - #* @return array success information. - #** - - ## Publish Example - info = pubnub.publish({ - 'channel' : 'hello_world', - 'message' : { - 'some_text' : 'Hello my World' - } - }) - print(info) - - """ - - message = self.encrypt(message) - - ## Send Message - return self._request({"urlcomponents": [ - 'publish', - self.publish_key, - self.subscribe_key, - '0', - 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): - """ - #** - #* presence - #* - #* This is BLOCKING. - #* Listen for presence events on a channel. - #* - #* @param array args with channel and callback. - #* @return false on fail, array on success. - #** - - ## Presence Example - def pres_event(message) : - print(message) - return True - - pubnub.presence({ - 'channel' : 'hello_world', - '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): - """ - #** - #* Here Now - #* - #* Load current occupancy from a channel. - #* - #* @param array args with 'channel'. - #* @return mixed false on fail, array on success. - #* - - ## Presence Example - here_now = pubnub.here_now({ - 'channel' : 'hello_world', - }) - print(here_now['occupancy']) - print(here_now['uuids']) - - """ - - ## Get Presence Here Now - return self._request({"urlcomponents": [ - '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)) - - def history(self, channel, count=100, reverse=False, - start=None, end=None, callback=None, error=None): - """ - #** - #* History - #* - #* Load history from a channel. - #* - - ## History Example - history = pubnub.detailedHistory({ - 'channel' : 'hello_world', - 'count' : 5 - }) - print(history) - - """ - - params = dict() - - params['count'] = count - params['reverse'] = reverse - params['start'] = start - params['end'] = end - - ## Get History - 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)) - - def time(self, callback=None): - """ - #** - #* Time - #* - #* Timestamp from PubNub Cloud. - #* - #* @return int timestamp. - #* - - ## PubNub Server Time Example - timestamp = pubnub.time() - print(timestamp) - - """ - - time = self._request({'urlcomponents': [ - 'time', - '0' - ]}, callback) - if time is not None: - return time[0] - - 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): - ## 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"]]) - if ("urlparams" in request): - url = url + '?' + "&".join([x + "=" + str(y) for x, y in request[ - "urlparams"].items() if y is not None]) - return url - - -try: - from hashlib import sha256 - digestmod = sha256 -except ImportError: - import Crypto.Hash.SHA256 as digestmod - sha256 = digestmod.new -import hmac - - -class EmptyLock(): - def __enter__(self): - pass - - def __exit__(self, a, b, c): - pass - -empty_lock = EmptyLock() - - -class PubnubCoreAsync(PubnubBase): - - 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, - _tt_lock=empty_lock, - _channel_list_lock=empty_lock - ): - """ - #** - #* Pubnub - #* - #* Init the Pubnub Client API - #* - #* @param string publish_key required key to send messages. - #* @param string subscribe_key required key to receive messages. - #* @param string secret_key required key to sign messages. - #* @param boolean ssl required for 2048 bit encrypted messages. - #* @param string origin PUBNUB Server Origin. - #** - - ## Initiat Class - pubnub = Pubnub( 'PUBLISH-KEY', 'SUBSCRIBE-KEY', 'SECRET-KEY', False ) - - """ - super(PubnubCoreAsync, 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=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 - - def get_channel_list(self, channels): - channel = '' - first = True - with self._channel_list_lock: - for ch in channels: - if not channels[ch]['subscribed']: - continue - if not first: - channel += ',' - else: - first = False - channel += ch - return channel - - def get_channel_array(self): - channels = self.subscriptions - channel = [] - with self._channel_list_lock: - for ch in channels: - if not channels[ch]['subscribed']: - continue - channel.append(ch) - return channel - - def each(l, func): - if func is None: - return - for i in l: - func(i) - - def subscribe(self, channel, callback, error=None, - connect=None, disconnect=None, reconnect=None, sync=False): - """ - #** - #* Subscribe - #* - #* This is NON-BLOCKING. - #* Listen for a message on a channel. - #* - #* @param array args with channel and message. - #* @return false on fail, array on success. - #** - - ## Subscribe Example - def receive(message) : - print(message) - return True - - ## On Connect Callback - def connected() : - pubnub.publish({ - 'channel' : 'hello_world', - 'message' : { 'some_var' : 'text' } - }) - - ## Subscribe - pubnub.subscribe({ - 'channel' : 'hello_world', - 'connect' : connected, - 'callback' : receive - }) - - """ - - with self._tt_lock: - 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): - if func is not None: - if msg is not None: - func(msg) - else: - func() - - def _invoke_connect(): - if self._channel_list_lock: - with self._channel_list_lock: - for ch in self.subscriptions: - chobj = self.subscriptions[ch] - if chobj['connected'] is False: - chobj['connected'] = True - _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) - else: - for ch in channel_list: - chobj = self.subscriptions[ch] - _invoke(chobj['error'], err) - - def _get_channel(): - for ch in self.subscriptions: - chobj = self.subscriptions[ch] - 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 - } - - ## 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 - - ## 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 - - _invoke_connect() - - with self._tt_lock: - 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]])) - else: - response_list = response[0] - chobj = _get_channel() - for r in response_list: - if chobj: - _invoke(chobj['callback'], self.decrypt(r)) - - _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": [ - 'subscribe', - self.subscribe_key, - channel_list, - '0', - str(self.timetoken) - ], "urlparams": {"uuid": self.uuid, "auth": self.auth_key}}, - sub_callback, - sub_callback, - single=True) - ''' - except Exception as e: - print(e) - self.timeout(1, _connect) - return - ''' - - self._connect = _connect - - ## BEGIN SUBSCRIPTION (LISTEN FOR MESSAGES) - _connect() - - def _reset_offline(self): - if self.SUB_RECEIVER is not None: - self.SUB_RECEIVER() - self.SUB_RECEIVER = None - - def CONNECT(self): - self._reset_offline() - self._connect() - - def unsubscribe(self, channel): - - if channel in self.subscriptions is False: - return False - - ## 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.CONNECT() - - -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 -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 -from twisted.internet.task import LoopingCall -import twisted -from hashlib import sha256 -import time -import json - -import traceback - - -from twisted.python.compat import ( - _PY3, unicode, intToBytes, networkString, nativeString) - -pnconn_pool = HTTPConnectionPool(reactor, persistent=True) -pnconn_pool.maxPersistentPerHost = 100000 -pnconn_pool.cachedConnectionTimeout = 15 -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 __init__( - self, - publish_key, - subscribe_key, - secret_key=False, - cipher_key=False, - auth_key=None, - ssl_on=False, - origin='pubsub.pubnub.com' - ): - 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, - ) - 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): - global pnconn_pool - - def _invoke(func, data): - if func is not None: - func(data) - - ## Build URL - - url = self.getUrl(request) - - agent = ContentDecoderAgent(RedirectAgent(Agent( - reactor, - contextFactory=WebClientContextFactory(), - pool=self.ssl and None or pnconn_pool - )), [('gzip', GzipDecoder)]) - - try: - request = agent.request( - 'GET', url, Headers(self.headers), None) - except TypeError as te: - request = agent.request( - 'GET', url.encode(), Headers(self.headers), None) - - if single is True: - id = time.time() - self.id = id - - def received(response): - if not isinstance(response, twisted.web._newclient.Response): - _invoke(error, {"message" : "Not Found"}) - return - - finished = Deferred() - if response.code in [401,403]: - response.deliverBody(PubNubPamResponse(finished)) - else: - response.deliverBody(PubNubResponse(finished)) - - return finished - - def complete(data): - if single is True: - if id != self.id: - return None - try: - data = json.loads(data) - except ValueError as e: - try: - data = json.loads(data.decode("utf-8")) - except ValueError as e: - _invoke(error, {'error': 'json decode error'}) - - if 'error' in data and 'status' in data and 'status' != 200: - _invoke(error, data) - else: - _invoke(callback, data) - - def abort(): - pass - - request.addCallback(received) - request.addCallback(complete) - - return abort - - -class WebClientContextFactory(ClientContextFactory): - def getContext(self, hostname, port): - return ClientContextFactory.getContext(self) - - -class PubNubPamResponse(Protocol): - def __init__(self, finished): - self.finished = finished - - def dataReceived(self, bytes): - self.finished.callback(bytes) - - -class PubNubResponse(Protocol): - def __init__(self, finished): - self.finished = finished - - def dataReceived(self, bytes): - self.finished.callback(bytes) diff --git a/python-twisted/unassembled/Platform.py b/python-twisted/unassembled/Platform.py deleted file mode 100644 index b220257..0000000 --- a/python-twisted/unassembled/Platform.py +++ /dev/null @@ -1,147 +0,0 @@ -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 -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 -from twisted.internet.task import LoopingCall -import twisted -from hashlib import sha256 -import time -import json - -import traceback - - -from twisted.python.compat import ( - _PY3, unicode, intToBytes, networkString, nativeString) - -pnconn_pool = HTTPConnectionPool(reactor, persistent=True) -pnconn_pool.maxPersistentPerHost = 100000 -pnconn_pool.cachedConnectionTimeout = 15 -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 __init__( - self, - publish_key, - subscribe_key, - secret_key=False, - cipher_key=False, - auth_key=None, - ssl_on=False, - origin='pubsub.pubnub.com' - ): - 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, - ) - 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): - global pnconn_pool - - def _invoke(func, data): - if func is not None: - func(data) - - ## Build URL - - url = self.getUrl(request) - - agent = ContentDecoderAgent(RedirectAgent(Agent( - reactor, - contextFactory=WebClientContextFactory(), - pool=self.ssl and None or pnconn_pool - )), [('gzip', GzipDecoder)]) - - try: - request = agent.request( - 'GET', url, Headers(self.headers), None) - except TypeError as te: - request = agent.request( - 'GET', url.encode(), Headers(self.headers), None) - - if single is True: - id = time.time() - self.id = id - - def received(response): - if not isinstance(response, twisted.web._newclient.Response): - _invoke(error, {"message" : "Not Found"}) - return - - finished = Deferred() - if response.code in [401,403]: - response.deliverBody(PubNubPamResponse(finished)) - else: - response.deliverBody(PubNubResponse(finished)) - - return finished - - def complete(data): - if single is True: - if id != self.id: - return None - try: - data = json.loads(data) - except ValueError as e: - try: - data = json.loads(data.decode("utf-8")) - except ValueError as e: - _invoke(error, {'error': 'json decode error'}) - - if 'error' in data and 'status' in data and 'status' != 200: - _invoke(error, data) - else: - _invoke(callback, data) - - def abort(): - pass - - request.addCallback(received) - request.addCallback(complete) - - return abort - - -class WebClientContextFactory(ClientContextFactory): - def getContext(self, hostname, port): - return ClientContextFactory.getContext(self) - - -class PubNubPamResponse(Protocol): - def __init__(self, finished): - self.finished = finished - - def dataReceived(self, bytes): - self.finished.callback(bytes) - - -class PubNubResponse(Protocol): - def __init__(self, finished): - self.finished = finished - - def dataReceived(self, bytes): - self.finished.callback(bytes) -- cgit v1.2.3 From c98286f500b77dcf426367df0b688f536b77ea9b Mon Sep 17 00:00:00 2001 From: Devendra Date: Thu, 24 Apr 2014 01:33:45 +0530 Subject: fixing imports --- python-twisted/examples/here-now-example.py | 2 +- python-twisted/examples/history-example.py | 2 +- python-twisted/examples/publish-example.py | 2 +- python-twisted/examples/subscribe-example.py | 2 +- python-twisted/examples/uuid-example.py | 2 +- python-twisted/tests/benchmark.py | 2 +- python-twisted/tests/delivery.py | 2 +- python-twisted/tests/subscribe-test.py | 2 +- python-twisted/tests/unit-test-full.py | 2 +- python-twisted/tests/unit-tests.py | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) (limited to 'python-twisted') diff --git a/python-twisted/examples/here-now-example.py b/python-twisted/examples/here-now-example.py index 0f34f36..4b2965b 100644 --- a/python-twisted/examples/here-now-example.py +++ b/python-twisted/examples/here-now-example.py @@ -10,7 +10,7 @@ ## ----------------------------------- import sys -from Pubnub import Pubnub +from Pubnub import PubnubTwisted as Pubnub publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo' subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' diff --git a/python-twisted/examples/history-example.py b/python-twisted/examples/history-example.py index 72c7445..f867a36 100644 --- a/python-twisted/examples/history-example.py +++ b/python-twisted/examples/history-example.py @@ -11,7 +11,7 @@ import sys from twisted.internet import reactor -from Pubnub import Pubnub +from Pubnub import PubnubTwisted as Pubnub publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo' subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' diff --git a/python-twisted/examples/publish-example.py b/python-twisted/examples/publish-example.py index 5d6cc29..d5af6a5 100644 --- a/python-twisted/examples/publish-example.py +++ b/python-twisted/examples/publish-example.py @@ -11,7 +11,7 @@ import sys from twisted.internet import reactor -from Pubnub import Pubnub +from Pubnub import PubnubTwisted as Pubnub publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo' subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' diff --git a/python-twisted/examples/subscribe-example.py b/python-twisted/examples/subscribe-example.py index b261b0d..3bca615 100644 --- a/python-twisted/examples/subscribe-example.py +++ b/python-twisted/examples/subscribe-example.py @@ -11,7 +11,7 @@ import sys from twisted.internet import reactor -from Pubnub import Pubnub +from Pubnub import PubnubTwisted as Pubnub publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo' subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' diff --git a/python-twisted/examples/uuid-example.py b/python-twisted/examples/uuid-example.py index 840f48c..a745088 100644 --- a/python-twisted/examples/uuid-example.py +++ b/python-twisted/examples/uuid-example.py @@ -11,7 +11,7 @@ import sys from twisted.internet import reactor -from Pubnub import Pubnub +from Pubnub import PubnubTwisted as Pubnub ## ----------------------------------------------------------------------- ## Initiate Pubnub State diff --git a/python-twisted/tests/benchmark.py b/python-twisted/tests/benchmark.py index 0e7b809..b6477c0 100644 --- a/python-twisted/tests/benchmark.py +++ b/python-twisted/tests/benchmark.py @@ -12,7 +12,7 @@ import sys import datetime from twisted.internet import reactor -from Pubnub import Pubnub +from Pubnub import PubnubTwisted as Pubnub publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo' subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' diff --git a/python-twisted/tests/delivery.py b/python-twisted/tests/delivery.py index d36e895..30ce55f 100644 --- a/python-twisted/tests/delivery.py +++ b/python-twisted/tests/delivery.py @@ -14,7 +14,7 @@ import datetime import time import math -from Pubnub import Pubnub +from Pubnub import PubnubTwisted as Pubnub ## ----------------------------------------------------------------------- ## Configuration diff --git a/python-twisted/tests/subscribe-test.py b/python-twisted/tests/subscribe-test.py index aca63ba..ba74992 100755 --- a/python-twisted/tests/subscribe-test.py +++ b/python-twisted/tests/subscribe-test.py @@ -11,7 +11,7 @@ import sys import datetime -from Pubnub import Pubnub +from Pubnub import PubnubTwisted as Pubnub from functools import partial from threading import current_thread import threading diff --git a/python-twisted/tests/unit-test-full.py b/python-twisted/tests/unit-test-full.py index 374772f..3aecf12 100644 --- a/python-twisted/tests/unit-test-full.py +++ b/python-twisted/tests/unit-test-full.py @@ -18,7 +18,7 @@ ## ----------------------------------- import sys -from Pubnub import Pubnub +from Pubnub import PubnubTwisted as Pubnub publish_key = len(sys.argv) > 1 and sys.argv[1] or 'demo' subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' diff --git a/python-twisted/tests/unit-tests.py b/python-twisted/tests/unit-tests.py index 169e1f1..70c373b 100644 --- a/python-twisted/tests/unit-tests.py +++ b/python-twisted/tests/unit-tests.py @@ -4,7 +4,7 @@ import time from PubnubUnitTest import Suite -from Pubnub import Pubnub +from Pubnub import PubnubTwisted as Pubnub pubnub = Pubnub("demo", "demo") -- cgit v1.2.3 From cf1021b3671fb7537ad7b3a4d577ef0fcace694a Mon Sep 17 00:00:00 2001 From: Devendra Date: Tue, 6 May 2014 16:43:09 +0530 Subject: modifying examples --- python-twisted/examples/here-now-example.py | 42 ---------------- python-twisted/examples/here-now.py | 33 ++++++++++++ python-twisted/examples/history-example.py | 46 ----------------- python-twisted/examples/history.py | 32 ++++++++++++ python-twisted/examples/publish-example.py | 75 ---------------------------- python-twisted/examples/publish.py | 33 ++++++++++++ python-twisted/examples/subscribe-example.py | 50 ------------------- python-twisted/examples/subscribe.py | 48 ++++++++++++++++++ python-twisted/examples/uuid-example.py | 27 ---------- 9 files changed, 146 insertions(+), 240 deletions(-) delete mode 100644 python-twisted/examples/here-now-example.py create mode 100644 python-twisted/examples/here-now.py delete mode 100644 python-twisted/examples/history-example.py create mode 100644 python-twisted/examples/history.py delete mode 100644 python-twisted/examples/publish-example.py create mode 100644 python-twisted/examples/publish.py delete mode 100644 python-twisted/examples/subscribe-example.py create mode 100644 python-twisted/examples/subscribe.py delete mode 100644 python-twisted/examples/uuid-example.py (limited to 'python-twisted') diff --git a/python-twisted/examples/here-now-example.py b/python-twisted/examples/here-now-example.py deleted file mode 100644 index 4b2965b..0000000 --- a/python-twisted/examples/here-now-example.py +++ /dev/null @@ -1,42 +0,0 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud. -# coding=utf8 - -## PubNub Real-time Push APIs and Notifications Framework -## Copyright (c) 2010 Stephen Blum -## http://www.pubnub.com/ - -## ----------------------------------- -## PubNub 3.1 Real-time Push Cloud API -## ----------------------------------- - -import sys -from Pubnub import PubnubTwisted as Pubnub - -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 - -## ----------------------------------------------------------------------- -## Initiate Pubnub State -## ----------------------------------------------------------------------- -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, error=here_now_complete) - -## ----------------------------------------------------------------------- -## IO Event Loop -## ----------------------------------------------------------------------- -pubnub.start() diff --git a/python-twisted/examples/here-now.py b/python-twisted/examples/here-now.py new file mode 100644 index 0000000..38b79f8 --- /dev/null +++ b/python-twisted/examples/here-now.py @@ -0,0 +1,33 @@ +## www.pubnub.com - PubNub Real-time push service in the cloud. +# coding=utf8 + +## PubNub Real-time Push APIs and Notifications Framework +## Copyright (c) 2010 Stephen Blum +## http://www.pubnub.com/ + + +import sys +from Pubnub import PubnubTwisted as Pubnub + +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 + +## ----------------------------------------------------------------------- +## 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) +channel = 'hello_world' + + +# Asynchronous usage + +def callback(message): + print(message) + +pubnub.here_now(channel, callback=callback, error=callback) + +pubnub.start() diff --git a/python-twisted/examples/history-example.py b/python-twisted/examples/history-example.py deleted file mode 100644 index f867a36..0000000 --- a/python-twisted/examples/history-example.py +++ /dev/null @@ -1,46 +0,0 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud. -# coding=utf8 - -## PubNub Real-time Push APIs and Notifications Framework -## Copyright (c) 2010 Stephen Blum -## http://www.pubnub.com/ - -## ----------------------------------- -## PubNub 3.1 Real-time Push Cloud API -## ----------------------------------- - -import sys -from twisted.internet import reactor -from Pubnub import PubnubTwisted as Pubnub - -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 - -## ----------------------------------------------------------------------- -## Initiate Pubnub State -## ----------------------------------------------------------------------- -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 -}) - -## ----------------------------------------------------------------------- -## IO Event Loop -## ----------------------------------------------------------------------- -reactor.run() diff --git a/python-twisted/examples/history.py b/python-twisted/examples/history.py new file mode 100644 index 0000000..10e86b3 --- /dev/null +++ b/python-twisted/examples/history.py @@ -0,0 +1,32 @@ +## www.pubnub.com - PubNub Real-time push service in the cloud. +# coding=utf8 + +## PubNub Real-time Push APIs and Notifications Framework +## Copyright (c) 2010 Stephen Blum +## http://www.pubnub.com/ + + +import sys +from Pubnub import PubnubTwisted as Pubnub + +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 + +## ----------------------------------------------------------------------- +## 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) +channel = 'a' + +# Asynchronous usage + +def callback(message): + print(message) + +pubnub.history(channel, count=2 , callback=callback, error=callback) + +pubnub.start() diff --git a/python-twisted/examples/publish-example.py b/python-twisted/examples/publish-example.py deleted file mode 100644 index d5af6a5..0000000 --- a/python-twisted/examples/publish-example.py +++ /dev/null @@ -1,75 +0,0 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud. -# coding=utf8 - -## PubNub Real-time Push APIs and Notifications Framework -## Copyright (c) 2010 Stephen Blum -## http://www.pubnub.com/ - -## ----------------------------------- -## PubNub 3.1 Real-time Push Cloud API -## ----------------------------------- - -import sys -from twisted.internet import reactor -from Pubnub import PubnubTwisted as Pubnub - -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 - -## ----------------------------------------------------------------------- -## Initiate Pubnub State -## ----------------------------------------------------------------------- -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)) - -## Publish string -pubnub.publish({ - 'channel': crazy, - 'message': 'Hello World!', - 'callback': publish_complete, - 'error': publish_error -}) - -## Publish list -li = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', - 'Saturday'] - -pubnub.publish({ - '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 -}) - - -pubnub.start() diff --git a/python-twisted/examples/publish.py b/python-twisted/examples/publish.py new file mode 100644 index 0000000..f7b746f --- /dev/null +++ b/python-twisted/examples/publish.py @@ -0,0 +1,33 @@ +## www.pubnub.com - PubNub Real-time push service in the cloud. +# coding=utf8 + +## PubNub Real-time Push APIs and Notifications Framework +## Copyright (c) 2010 Stephen Blum +## http://www.pubnub.com/ + + +import sys +from Pubnub import PubnubTwisted as Pubnub + +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 + +## ----------------------------------------------------------------------- +## 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) +channel = 'hello_world' +message = 'Hello World !!!' + +# Asynchronous usage + +def callback(message): + print(message) + +pubnub.publish(channel, message, callback=callback, error=callback) + +pubnub.start() diff --git a/python-twisted/examples/subscribe-example.py b/python-twisted/examples/subscribe-example.py deleted file mode 100644 index 3bca615..0000000 --- a/python-twisted/examples/subscribe-example.py +++ /dev/null @@ -1,50 +0,0 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud. -# coding=utf8 - -## PubNub Real-time Push APIs and Notifications Framework -## Copyright (c) 2010 Stephen Blum -## http://www.pubnub.com/ - -## ----------------------------------- -## PubNub 3.1 Real-time Push Cloud API -## ----------------------------------- - -import sys -from twisted.internet import reactor -from Pubnub import PubnubTwisted as Pubnub - -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 - -## ----------------------------------------------------------------------- -## 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' - -## ----------------------------------------------------------------------- -## Subscribe Example -## ----------------------------------------------------------------------- - - -def message_received(message): - print(message) - - -def connected(): - print 'Connected' - -pubnub.subscribe({ - 'channel': crazy, - 'connect': connected, - 'callback': message_received -}) - -## ----------------------------------------------------------------------- -## IO Event Loop -## ----------------------------------------------------------------------- -reactor.run() diff --git a/python-twisted/examples/subscribe.py b/python-twisted/examples/subscribe.py new file mode 100644 index 0000000..1462a69 --- /dev/null +++ b/python-twisted/examples/subscribe.py @@ -0,0 +1,48 @@ +## www.pubnub.com - PubNub Real-time push service in the cloud. +# coding=utf8 + +## PubNub Real-time Push APIs and Notifications Framework +## Copyright (c) 2010 Stephen Blum +## http://www.pubnub.com/ + + +import sys +from Pubnub import PubnubTwisted as Pubnub + +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 + +## ----------------------------------------------------------------------- +## 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) + +channel = 'a' + + + +# Asynchronous usage + +def callback(message, channel): + print(message) + +def error(message): + print("ERROR : " + str(message)) + +def connect(message): + print("CONNECTED") + +def reconnect(message): + print("RECONNECTED") + +def disconnect(message): + print("DISCONNECTED") + + +pubnub.subscribe(channel, callback=callback, error=callback, connect=connect, reconnect=reconnect, disconnect=disconnect) + +pubnub.start() diff --git a/python-twisted/examples/uuid-example.py b/python-twisted/examples/uuid-example.py deleted file mode 100644 index a745088..0000000 --- a/python-twisted/examples/uuid-example.py +++ /dev/null @@ -1,27 +0,0 @@ -## www.pubnub.com - PubNub Real-time push service in the cloud. -# coding=utf8 - -## PubNub Real-time Push APIs and Notifications Framework -## Copyright (c) 2010 Stephen Blum -## http://www.pubnub.com/ - -## ----------------------------------- -## PubNub 3.1 Real-time Push Cloud API -## ----------------------------------- - -import sys -from twisted.internet import reactor -from Pubnub import PubnubTwisted as Pubnub - -## ----------------------------------------------------------------------- -## Initiate Pubnub State -## ----------------------------------------------------------------------- -pubnub = Pubnub("", "", "", False) - -## ----------------------------------------------------------------------- -## UUID Example -## ----------------------------------------------------------------------- - -uuid = pubnub.uuid() -print "UUID: " -print uuid -- cgit v1.2.3 From 1b49e712e12ba833f460324b95969b162d464edf Mon Sep 17 00:00:00 2001 From: Devendra Date: Wed, 7 May 2014 12:13:17 +0530 Subject: console changes and pep8 compliance --- python-twisted/examples/history.py | 5 +++-- python-twisted/examples/publish.py | 5 +++-- python-twisted/examples/subscribe.py | 11 +++++++---- 3 files changed, 13 insertions(+), 8 deletions(-) (limited to 'python-twisted') diff --git a/python-twisted/examples/history.py b/python-twisted/examples/history.py index 10e86b3..81974ec 100644 --- a/python-twisted/examples/history.py +++ b/python-twisted/examples/history.py @@ -20,13 +20,14 @@ ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False ## ----------------------------------------------------------------------- pubnub = Pubnub(publish_key=publish_key, subscribe_key=subscribe_key, secret_key=secret_key, cipher_key=cipher_key, ssl_on=ssl_on) -channel = 'a' +channel = 'a' # Asynchronous usage + def callback(message): print(message) -pubnub.history(channel, count=2 , callback=callback, error=callback) +pubnub.history(channel, count=2, callback=callback, error=callback) pubnub.start() diff --git a/python-twisted/examples/publish.py b/python-twisted/examples/publish.py index f7b746f..13b5357 100644 --- a/python-twisted/examples/publish.py +++ b/python-twisted/examples/publish.py @@ -20,11 +20,12 @@ ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False ## ----------------------------------------------------------------------- pubnub = Pubnub(publish_key=publish_key, subscribe_key=subscribe_key, secret_key=secret_key, cipher_key=cipher_key, ssl_on=ssl_on) -channel = 'hello_world' -message = 'Hello World !!!' +channel = 'hello_world' +message = 'Hello World !!!' # Asynchronous usage + def callback(message): print(message) diff --git a/python-twisted/examples/subscribe.py b/python-twisted/examples/subscribe.py index 1462a69..9c73439 100644 --- a/python-twisted/examples/subscribe.py +++ b/python-twisted/examples/subscribe.py @@ -21,28 +21,31 @@ ssl_on = len(sys.argv) > 5 and bool(sys.argv[5]) or False pubnub = Pubnub(publish_key=publish_key, subscribe_key=subscribe_key, secret_key=secret_key, cipher_key=cipher_key, ssl_on=ssl_on) -channel = 'a' - +channel = 'a' # Asynchronous usage - def callback(message, channel): print(message) + def error(message): print("ERROR : " + str(message)) + def connect(message): print("CONNECTED") + def reconnect(message): print("RECONNECTED") + def disconnect(message): print("DISCONNECTED") -pubnub.subscribe(channel, callback=callback, error=callback, connect=connect, reconnect=reconnect, disconnect=disconnect) +pubnub.subscribe(channel, callback=callback, error=callback, + connect=connect, reconnect=reconnect, disconnect=disconnect) pubnub.start() -- cgit v1.2.3 From 32492b68b66a46bdbf6736e1ddd16a34dca12b9b Mon Sep 17 00:00:00 2001 From: Devendra Date: Thu, 15 May 2014 19:48:06 +0530 Subject: adding more unit tests --- python-twisted/tests/test_grant_async.py | 359 +++++++++++++++++++++++++++++ python-twisted/tests/test_publish_async.py | 304 ++++++++++++++++++++++++ python-twisted/tests/unit-tests.py | 107 --------- 3 files changed, 663 insertions(+), 107 deletions(-) create mode 100644 python-twisted/tests/test_grant_async.py create mode 100644 python-twisted/tests/test_publish_async.py delete mode 100644 python-twisted/tests/unit-tests.py (limited to 'python-twisted') diff --git a/python-twisted/tests/test_grant_async.py b/python-twisted/tests/test_grant_async.py new file mode 100644 index 0000000..5b33b11 --- /dev/null +++ b/python-twisted/tests/test_grant_async.py @@ -0,0 +1,359 @@ + + +from Pubnub import PubnubTwisted as Pubnub +import time + +pubnub = Pubnub("demo","demo") +pubnub_pam = Pubnub("pub-c-c077418d-f83c-4860-b213-2f6c77bde29a", + "sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe", "sec-c-OGU3Y2Q4ZWUtNDQwMC00NTI1LThjNWYtNWJmY2M4OGIwNjEy") + + + +# Grant permission read true, write true, on channel ( Async Mode ) +def test_1(): + + def _callback(resp, ch= None): + assert resp == { + 'message': u'Success', + 'payload': {u'auths': {u'abcd': {u'r': 1, u'w': 1}}, + u'subscribe_key': u'sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe', + u'level': u'user', u'channel': u'abcd', u'ttl': 1} + } + + def _error(response): + assert False + + pubnub_pam.grant(channel="abcd", auth_key="abcd", read=True, write=True, ttl=1, callback=_callback, error=_error) + + +# Grant permission read false, write false, on channel ( Async Mode ) +def test_2(): + + def _callback(resp, ch=None): + assert resp == { + 'message': u'Success', + 'payload': {u'auths': {u'abcd': {u'r': 0, u'w': 0}}, + u'subscribe_key': u'sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe', + u'level': u'user', u'channel': u'abcd', u'ttl': 1} + } + + def _error(response): + assert False + + pubnub_pam.grant(channel="abcd", auth_key="abcd", read=False, write=False, ttl=1, callback=_callback, error=_error) + + +# Grant permission read True, write false, on channel ( Async Mode ) +def test_3(): + + def _callback(resp, ch=None): + assert resp == { + 'message': u'Success', + 'payload': {u'auths': {u'abcd': {u'r': 1, u'w': 0}}, + u'subscribe_key': u'sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe', + u'level': u'user', u'channel': u'abcd', u'ttl': 1} + } + + def _error(response): + assert False + + pubnub_pam.grant(channel="abcd", auth_key="abcd", read=True, write=False, ttl=1, callback=_callback, error=_error) + + +# Grant permission read False, write True, on channel ( Async Mode ) +def test_4(): + + def _callback(resp, ch=None): + assert resp == { + 'message': u'Success', + 'payload': {u'auths': {u'abcd': {u'r': 0, u'w': 1}}, + u'subscribe_key': u'sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe', + u'level': u'user', u'channel': u'abcd', u'ttl': 1} + } + + def _error(response): + assert False + + pubnub_pam.grant(channel="abcd", auth_key="abcd", read=False, write=True, ttl=1, callback=_callback, error=_error) + + +# Grant permission read False, write True, on channel ( Async Mode ), TTL 10 +def test_5(): + + def _callback(resp,ch=None): + assert resp == { + 'message': u'Success', + 'payload': {u'auths': {u'abcd': {u'r': 0, u'w': 1}}, + u'subscribe_key': u'sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe', + u'level': u'user', u'channel': u'abcd', u'ttl': 10} + } + + + def _error(response): + assert False + + pubnub_pam.grant(channel="abcd", auth_key="abcd", read=False, write=True, ttl=10, callback=_callback, error=_error) + + +# Grant permission read False, write True, without channel ( Async Mode ), TTL 10 +def test_6(): + def _callback(resp, ch=None): + assert resp == { + 'message': u'Success', + 'payload': { u'r': 0, u'w': 1, + u'subscribe_key': u'sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe', + u'level': u'subkey', u'ttl': 10} + } + + def _error(response): + assert False + + pubnub_pam.grant(auth_key="abcd", read=False, write=True, ttl=10, callback=_callback, error=_error) + + + +# Grant permission read False, write False, without channel ( Async Mode ) +def test_7(): + + def _callback(resp, ch=None): + assert resp == { + 'message': u'Success', + 'payload': { u'r': 0, u'w': 0, + u'subscribe_key': u'sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe', + u'level': u'subkey', u'ttl': 1} + } + + def _error(response): + resp['response'] = response + + pubnub_pam.grant(auth_key="abcd", read=False, write=False, callback=_callback, error=_error) + + +# Complete flow , try publish on forbidden channel, grant permission to subkey and try again. ( Sync Mode) + +def test_8(): + channel = "test_8-" + str(time.time()) + message = "Hello World" + auth_key = "auth-" + channel + pubnub_pam.set_auth_key(auth_key) + + def _cb1(resp, ch=None): + assert False + def _err1(resp): + assert resp['message'] == 'Forbidden' + assert resp['payload'] == {u'channels': [channel]} + def _cb2(resp, ch=None): + assert resp == { + 'message': u'Success', + 'payload': {u'auths': {auth_key : {u'r': 1, u'w': 1}}, + u'subscribe_key': u'sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe', + u'level': u'user', u'channel': channel, u'ttl': 10} + } + def _cb3(resp, ch=None): + assert resp[0] == 1 + def _err3(resp): + assert False + + pubnub_pam.publish(channel=channel,message=message, callback=_cb3, error=_err3) + def _err2(resp): + assert False + + + pubnub_pam.grant(channel=channel, read=True, write=True, auth_key=auth_key, ttl=10, callback=_cb2, error=_err2) + + pubnub_pam.publish(channel=channel,message=message, callback=_cb1, error=_err1) + + +# Complete flow , try publish on forbidden channel, grant permission to authkey and try again. +# then revoke and try again +def test_9(): + channel = "test_9-" + str(time.time()) + message = "Hello World" + auth_key = "auth-" + channel + pubnub_pam.set_auth_key(auth_key) + + def _cb1(resp, ch=None): + assert False + def _err1(resp): + assert resp['message'] == 'Forbidden' + assert resp['payload'] == {u'channels': [channel]} + def _cb2(resp, ch=None): + assert resp == { + 'message': u'Success', + 'payload': {u'auths': {auth_key : {u'r': 1, u'w': 1}}, + u'subscribe_key': u'sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe', + u'level': u'user', u'channel': channel, u'ttl': 10} + } + def _cb3(resp, ch=None): + assert resp[0] == 1 + def _cb4(resp, ch=None): + assert resp == { + 'message': u'Success', + 'payload': {u'auths': {auth_key : {u'r': 0, u'w': 0}}, + u'subscribe_key': u'sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe', + u'level': u'user', u'channel': channel, u'ttl': 1} + } + + def _cb5(resp, ch=None): + assert False + def _err5(resp): + assert resp['message'] == 'Forbidden' + assert resp['payload'] == {u'channels': [channel]} + + pubnub_pam.publish(channel=channel,message=message, callback=_cb5, error=_err5) + def _err4(resp): + assert False + pubnub_pam.revoke(channel=channel, auth_key=auth_key, callback=_cb4, error=_err4) + def _err3(resp): + assert False + + pubnub_pam.publish(channel=channel,message=message, callback=_cb3, error=_err3) + def _err2(resp): + assert False + + + pubnub_pam.grant(channel=channel, read=True, write=True, auth_key=auth_key, ttl=10, callback=_cb2, error=_err2) + + pubnub_pam.publish(channel=channel,message=message, callback=_cb1, error=_err1) + + +# Complete flow , try publish on forbidden channel, grant permission channel level for subkey and try again. +# then revoke and try again +def test_10(): + channel = "test_10-" + str(time.time()) + message = "Hello World" + auth_key = "auth-" + channel + pubnub_pam.set_auth_key(auth_key) + + def _cb1(resp, ch=None): + assert False + def _err1(resp): + assert resp['message'] == 'Forbidden' + assert resp['payload'] == {u'channels': [channel]} + def _cb2(resp, ch=None): + assert resp == { + 'message': u'Success', + 'payload': { u'channels': {channel: {u'r': 1, u'w': 1}}, + u'subscribe_key': u'sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe', + u'level': u'channel', u'ttl': 10} + } + def _cb3(resp, ch=None): + assert resp[0] == 1 + def _cb4(resp, ch=None): + assert resp == { + 'message': u'Success', + 'payload': { u'channels': {channel : {u'r': 0, u'w': 0}}, + u'subscribe_key': u'sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe', + u'level': u'channel', u'ttl': 1} + } + + def _cb5(resp, ch=None): + assert False + def _err5(resp): + assert resp['message'] == 'Forbidden' + assert resp['payload'] == {u'channels': [channel]} + + pubnub_pam.publish(channel=channel,message=message, callback=_cb5, error=_err5) + def _err4(resp): + assert False + pubnub_pam.revoke(channel=channel, callback=_cb4, error=_err4) + def _err3(resp): + assert False + + pubnub_pam.publish(channel=channel,message=message, callback=_cb3, error=_err3) + def _err2(resp): + assert False + + + pubnub_pam.grant(channel=channel, read=True, write=True, ttl=10, callback=_cb2, error=_err2) + + pubnub_pam.publish(channel=channel,message=message, callback=_cb1, error=_err1) + + + + + + +# Complete flow , try publish on forbidden channel, grant permission subkey level for subkey and try again. +# then revoke and try again +def test_11(): + channel = "test_11-" + str(time.time()) + message = "Hello World" + auth_key = "auth-" + channel + pubnub_pam.set_auth_key(auth_key) + + def _cb1(resp, ch=None): + assert False + def _err1(resp): + assert resp['message'] == 'Forbidden' + assert resp['payload'] == {u'channels': [channel]} + def _cb2(resp, ch=None): + assert resp == { + 'message': u'Success', + 'payload': { u'r': 1, u'w': 1, + u'subscribe_key': u'sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe', + u'level': u'subkey', u'ttl': 10} + } + def _cb3(resp, ch=None): + assert resp[0] == 1 + def _cb4(resp, ch=None): + assert resp == { + 'message': u'Success', + 'payload': {u'r': 0, u'w': 0, + u'subscribe_key': u'sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe', + u'level': u'subkey', u'ttl': 1} + } + + def _cb5(resp, ch=None): + assert False + def _err5(resp): + assert resp['message'] == 'Forbidden' + assert resp['payload'] == {u'channels': [channel]} + + pubnub_pam.publish(channel=channel,message=message, callback=_cb5, error=_err5) + def _err4(resp): + assert False + pubnub_pam.revoke(callback=_cb4, error=_err4) + def _err3(resp): + assert False + + pubnub_pam.publish(channel=channel,message=message, callback=_cb3, error=_err3) + def _err2(resp): + assert False + + + pubnub_pam.grant(read=True, write=True, ttl=10, callback=_cb2, error=_err2) + + pubnub_pam.publish(channel=channel,message=message, callback=_cb1, error=_err1) + + +x = 5 +def run_test(t): + global x + x += 5 + i = (x / 5) - 1 + def _print(): + print('Running test ' + str(i)) + pubnub.timeout(x, _print) + pubnub.timeout(x + 1,t) + +def stop(): + pubnub.stop() + +run_test(test_1) +run_test(test_2) +run_test(test_3) +run_test(test_4) +run_test(test_5) +run_test(test_6) +run_test(test_7) +run_test(test_8) +run_test(test_9) +run_test(test_10) +run_test(test_11) +run_test(stop) + + +pubnub_pam.start() + + diff --git a/python-twisted/tests/test_publish_async.py b/python-twisted/tests/test_publish_async.py new file mode 100644 index 0000000..391297d --- /dev/null +++ b/python-twisted/tests/test_publish_async.py @@ -0,0 +1,304 @@ + + +from Pubnub import PubnubTwisted as Pubnub +import time + +pubnub = Pubnub("demo","demo") +pubnub_enc = Pubnub("demo", "demo", cipher_key="enigma") +pubnub_pam = Pubnub("pub-c-c077418d-f83c-4860-b213-2f6c77bde29a", + "sub-c-e8839098-f568-11e2-a11a-02ee2ddab7fe", "sec-c-OGU3Y2Q4ZWUtNDQwMC00NTI1LThjNWYtNWJmY2M4OGIwNjEy") + + + +# Publish and receive string +def test_1(): + + channel = "test_1-" + str(time.time()) + message = "I am a string" + + def _cb(resp, ch=None): + assert resp == message + pubnub.unsubscribe(channel) + + def _connect(resp): + def _cb1(resp,ch=None): + assert resp[0] == 1 + def _err1(resp): + assert False + pubnub.publish(channel,message, callback=_cb1, error=_err1) + + def _error(resp): + assert False + + pubnub.subscribe(channel, callback=_cb, connect=_connect, error=_error) + +# Publish and receive array +def test_2(): + + channel = "test_2-" + str(time.time()) + message = [1,2] + + def _cb(resp, ch=None): + assert resp == message + pubnub.unsubscribe(channel) + + def _connect(resp): + def _cb1(resp,ch=None): + assert resp[0] == 1 + def _err1(resp): + assert False + pubnub.publish(channel,message, callback=_cb1, error=_err1) + + def _error(resp): + assert False + + pubnub.subscribe(channel, callback=_cb, connect=_connect, error=_error) + +# Publish and receive json object +def test_3(): + + channel = "test_2-" + str(time.time()) + message = { "a" : "b" } + + def _cb(resp, ch=None): + assert resp == message + pubnub.unsubscribe(channel) + + def _connect(resp): + def _cb1(resp,ch=None): + assert resp[0] == 1 + def _err1(resp): + assert False + pubnub.publish(channel,message, callback=_cb1, error=_err1) + + def _error(resp): + assert False + + pubnub.subscribe(channel, callback=_cb, connect=_connect, error=_error) + +# Publish and receive number +def test_4(): + + channel = "test_2-" + str(time.time()) + message = 100 + + def _cb(resp, ch=None): + assert resp == message + pubnub.unsubscribe(channel) + + def _connect(resp): + def _cb1(resp,ch=None): + assert resp[0] == 1 + def _err1(resp): + assert False + pubnub.publish(channel,message, callback=_cb1, error=_err1) + + def _error(resp): + assert False + + pubnub.subscribe(channel, callback=_cb, connect=_connect, error=_error) + +# Publish and receive number string +def test_5(): + + channel = "test_5-" + str(time.time()) + message = "100" + + def _cb(resp, ch=None): + assert resp == message + pubnub.unsubscribe(channel) + + def _connect(resp): + def _cb1(resp,ch=None): + assert resp[0] == 1 + def _err1(resp): + assert False + pubnub.publish(channel,message, callback=_cb1, error=_err1) + + def _error(resp): + assert False + + pubnub.subscribe(channel, callback=_cb, connect=_connect, error=_error) + + +# Publish and receive string (Encryption enabled) +def test_6(): + + channel = "test_6-" + str(time.time()) + message = "I am a string" + + def _cb(resp, ch=None): + assert resp == message + pubnub_enc.unsubscribe(channel) + + def _connect(resp): + def _cb1(resp,ch=None): + assert resp[0] == 1 + def _err1(resp): + assert False + pubnub_enc.publish(channel,message, callback=_cb1, error=_err1) + + def _error(resp): + assert False + + pubnub_enc.subscribe(channel, callback=_cb, connect=_connect, error=_error) + +# Publish and receive array (Encryption enabled) +def test_7(): + + channel = "test_7-" + str(time.time()) + message = [1,2] + + def _cb(resp, ch=None): + assert resp == message + pubnub_enc.unsubscribe(channel) + + def _connect(resp): + def _cb1(resp,ch=None): + assert resp[0] == 1 + def _err1(resp): + assert False + pubnub_enc.publish(channel,message, callback=_cb1, error=_err1) + + def _error(resp): + assert False + + pubnub_enc.subscribe(channel, callback=_cb, connect=_connect, error=_error) + +# Publish and receive json object (Encryption enabled) +def test_8(): + + channel = "test_8-" + str(time.time()) + message = { "a" : "b" } + + def _cb(resp, ch=None): + assert resp == message + pubnub_enc.unsubscribe(channel) + + def _connect(resp): + def _cb1(resp,ch=None): + assert resp[0] == 1 + def _err1(resp): + assert False + pubnub_enc.publish(channel,message, callback=_cb1, error=_err1) + + def _error(resp): + assert False + + pubnub_enc.subscribe(channel, callback=_cb, connect=_connect, error=_error) + +# Publish and receive number (Encryption enabled) +def test_9(): + + channel = "test_9-" + str(time.time()) + message = 100 + + def _cb(resp, ch=None): + assert resp == message + pubnub_enc.unsubscribe(channel) + + def _connect(resp): + def _cb1(resp,ch=None): + assert resp[0] == 1 + def _err1(resp): + assert False + pubnub_enc.publish(channel,message, callback=_cb1, error=_err1) + + def _error(resp): + assert False + + pubnub_enc.subscribe(channel, callback=_cb, connect=_connect, error=_error) + +# Publish and receive number string (Encryption enabled) +def test_10(): + + channel = "test_10-" + str(time.time()) + message = "100" + + def _cb(resp, ch=None): + assert resp == message + pubnub_enc.unsubscribe(channel) + + def _connect(resp): + def _cb1(resp,ch=None): + assert resp[0] == 1 + def _err1(resp): + assert False + pubnub_enc.publish(channel,message, callback=_cb1, error=_err1) + + def _error(resp): + assert False + + pubnub_enc.subscribe(channel, callback=_cb, connect=_connect, error=_error) + +# Publish and receive object string (Encryption enabled) +def test_11(): + + channel = "test_11-" + str(time.time()) + message = '{"a" : "b"}' + + def _cb(resp, ch=None): + assert resp == message + pubnub_enc.unsubscribe(channel) + + def _connect(resp): + def _cb1(resp,ch=None): + assert resp[0] == 1 + def _err1(resp): + assert False + pubnub_enc.publish(channel,message, callback=_cb1, error=_err1) + + def _error(resp): + assert False + + pubnub_enc.subscribe(channel, callback=_cb, connect=_connect, error=_error) + +# Publish and receive array string (Encryption enabled) +def test_12(): + + channel = "test_12-" + str(time.time()) + message = '[1,2]' + + def _cb(resp, ch=None): + assert resp == message + pubnub_enc.unsubscribe(channel) + + def _connect(resp): + def _cb1(resp,ch=None): + assert resp[0] == 1 + def _err1(resp): + assert False + pubnub_enc.publish(channel,message, callback=_cb1, error=_err1) + + def _error(resp): + assert False + + pubnub_enc.subscribe(channel, callback=_cb, connect=_connect, error=_error) + +x = 5 +def run_test(t): + global x + x += 5 + i = (x / 5) - 1 + def _print(): + print('Running test ' + str(i)) + pubnub.timeout(x, _print) + pubnub.timeout(x + 1,t) + +def stop(): + pubnub.stop() + +run_test(test_1) +run_test(test_2) +run_test(test_3) +run_test(test_4) +run_test(test_5) +run_test(test_6) +run_test(test_7) +run_test(test_8) +run_test(test_9) +run_test(test_10) +run_test(test_11) +run_test(stop) + +pubnub_enc.start() diff --git a/python-twisted/tests/unit-tests.py b/python-twisted/tests/unit-tests.py deleted file mode 100644 index 70c373b..0000000 --- a/python-twisted/tests/unit-tests.py +++ /dev/null @@ -1,107 +0,0 @@ - -import sys -import time - - -from PubnubUnitTest import Suite -from Pubnub import PubnubTwisted as Pubnub - -pubnub = Pubnub("demo", "demo") - -tests_count = 1 + 2 + 1 -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) - - def fail(e): - test_suite.test(False, msg, e) - - 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 - }) -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 - }) -tests.append(test_here_now) - - -for t in tests: - t() - -pubnub.start() -- cgit v1.2.3 From 30202de8be4ba24f4fba8dda4b3f28f6ee6600aa Mon Sep 17 00:00:00 2001 From: Devendra Date: Tue, 17 Jun 2014 00:58:40 +0530 Subject: readme changes --- python-twisted/README | 98 +++++++++++++++------------------------------------ 1 file changed, 29 insertions(+), 69 deletions(-) (limited to 'python-twisted') diff --git a/python-twisted/README b/python-twisted/README index 5f9b350..402fb34 100644 --- a/python-twisted/README +++ b/python-twisted/README @@ -16,103 +16,63 @@ ## This is a cloud-based service for broadcasting Real-time messages ## to thousands of web and mobile clients simultaneously. -## ---------------------------------------------------- -## Python Twisted Setup -## ---------------------------------------------------- -## Download BZ2 archive from http://twistedmatrix.com/ -## -## > tar xvfj Twisted-12.1.0.tar.bz2 -## > cd Twisted-12.1.0 -## > sudo python setup.py install -## -## ---------------------------------------------------- -## Third Party Libraries Dependency -## ---------------------------------------------------- -## You must download and install, -## -## 1. pyopenssl -## Download from https://launchpad.net/pyopenssl -## -## 2. pycrypto -## Download from https://github.com/dlitz/pycrypto OR -## from http://code.google.com/p/uploadprj/downloads/detail?name=pycrypto-2.3.win32-py2.7.zip&can=2&q +from Pubnub import PubnubTwisted as Pubnub ## --------------- ## Python Push API ## --------------- -pubnub = Pubnub( - "demo", ## PUBLISH_KEY - "demo", ## SUBSCRIBE_KEY - "demo", ## SECRET_KEY - "", ## CIPHER_KEY (Cipher key is Optional) - False ## SSL_ON? -) +pubnub = Pubnub(publish_key="demo", subscribe_key="demo", ssl_on=False) ## ----------------------------------------------------------------------- ## IO Event Loop ## ----------------------------------------------------------------------- ## VERY IMPORTANT TO ADD THIS LINE AT THE VERY BOTTOM! ## -## reactor.run() ## IMPORTANT! +## pubnub.start() ## IMPORTANT! ## ## ----------------------------------------------------------------------- ## Subscribe Example ## ----------------------------------------------------------------------- -def connected() : - ## ----------------------------------------------------------------------- - ## Publish Example - ## ----------------------------------------------------------------------- - def publish_complete(info): - print(info) - - pubnub.publish({ - 'channel' : "my-twisted-channel", - 'message' : { - 'some_text' : 'Hello World!' - }, - 'callback' : publish_complete - }) - -def message_received(message): +channel = 'hello_world' + +def callback(message, channel): print(message) -pubnub.subscribe({ - 'channel' : "my-twisted-channel", - 'connect' : connected, - 'callback' : message_received -}) -## ----------------------------------------------------------------------- -## Time Example -## ----------------------------------------------------------------------- -def time_complete(timestamp): - print(timestamp) +def error(message): + print("ERROR : " + str(message)) + + +def connect(message): + print("CONNECTED") + + +def reconnect(message): + print("RECONNECTED") + + +def disconnect(message): + print("DISCONNECTED") + + +pubnub.subscribe(channel, callback=callback, error=callback, + connect=connect, reconnect=reconnect, disconnect=disconnect) -pubnub.time({ 'callback' : time_complete }) ## ----------------------------------------------------------------------- ## History Example ## ----------------------------------------------------------------------- -def history_complete(messages): - print(messages) +def callback(message): + print(message) + +pubnub.history(channel, count=2, callback=callback, error=callback) -pubnub.history( { - 'channel' : "my-twisted-channel", - 'limit' : 10, - 'callback' : history_complete -}) -## ----------------------------------------------------------------------- -## UUID Example -## ----------------------------------------------------------------------- -uuid = pubnub.uuid() -print "UUID" -print uuid ## ----------------------------------------------------------------------- ## IO Event Loop ## ----------------------------------------------------------------------- -reactor.run() +pubnub.start() -- cgit v1.2.3 From c731ae584de53da55ed799f8fd59bff10b9b9b72 Mon Sep 17 00:00:00 2001 From: Devendra Date: Tue, 17 Jun 2014 02:43:16 +0530 Subject: readme changes --- python-twisted/README | 78 --------------------- python-twisted/README.md | 61 ++++++++++++++++ python-twisted/migration.md | 164 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 225 insertions(+), 78 deletions(-) delete mode 100644 python-twisted/README create mode 100644 python-twisted/README.md create mode 100644 python-twisted/migration.md (limited to 'python-twisted') diff --git a/python-twisted/README b/python-twisted/README deleted file mode 100644 index 402fb34..0000000 --- a/python-twisted/README +++ /dev/null @@ -1,78 +0,0 @@ -## --------------------------------------------------- -## -## YOU MUST HAVE A PUBNUB ACCOUNT TO USE THE API. -## http://www.pubnub.com/account -## -## ---------------------------------------------------- - -## ---------------------------------------------------- -## PubNub 3.1 Real-time Cloud Push API - PYTHON TWISTED -## ---------------------------------------------------- -## -## www.pubnub.com - PubNub Real-time Push Service in the Cloud. -## http://github.com/pubnub/pubnub-api/tree/master/python-twisted/ -## -## PubNub is a Massively Scalable Real-time Service for Web and Mobile Games. -## This is a cloud-based service for broadcasting Real-time messages -## to thousands of web and mobile clients simultaneously. - - -from Pubnub import PubnubTwisted as Pubnub - -## --------------- -## Python Push API -## --------------- -pubnub = Pubnub(publish_key="demo", subscribe_key="demo", ssl_on=False) - -## ----------------------------------------------------------------------- -## IO Event Loop -## ----------------------------------------------------------------------- -## VERY IMPORTANT TO ADD THIS LINE AT THE VERY BOTTOM! -## -## pubnub.start() ## IMPORTANT! -## - -## ----------------------------------------------------------------------- -## Subscribe Example -## ----------------------------------------------------------------------- - -channel = 'hello_world' - -def callback(message, channel): - print(message) - - -def error(message): - print("ERROR : " + str(message)) - - -def connect(message): - print("CONNECTED") - - -def reconnect(message): - print("RECONNECTED") - - -def disconnect(message): - print("DISCONNECTED") - - -pubnub.subscribe(channel, callback=callback, error=callback, - connect=connect, reconnect=reconnect, disconnect=disconnect) - - -## ----------------------------------------------------------------------- -## History Example -## ----------------------------------------------------------------------- -def callback(message): - print(message) - -pubnub.history(channel, count=2, callback=callback, error=callback) - - - -## ----------------------------------------------------------------------- -## IO Event Loop -## ----------------------------------------------------------------------- -pubnub.start() diff --git a/python-twisted/README.md b/python-twisted/README.md new file mode 100644 index 0000000..47045f5 --- /dev/null +++ b/python-twisted/README.md @@ -0,0 +1,61 @@ +## PubNub 3.5.0 Web Data Push Cloud-hosted API - PYTHON TWISTED +#### www.pubnub.com - PubNub Web Data Push Service in the Cloud. +#### http://github.com/pubnub/python + +#### Import +``` +from Pubnub import PubnubTwisted as Pubnub +``` + +#### Init +pubnub = Pubnub(publish_key="demo", subscribe_key="demo", ssl_on=False) + + +#### IO Event Loop +##### VERY IMPORTANT TO ADD THIS LINE AT THE VERY BOTTOM! + +``` +pubnub.start() +``` + +#### Subscribe Example +``` +channel = 'hello_world' + +def callback(message, channel): + print(message) + + +def error(message): + print("ERROR : " + str(message)) + + +def connect(message): + print("CONNECTED") + + +def reconnect(message): + print("RECONNECTED") + + +def disconnect(message): + print("DISCONNECTED") + + +pubnub.subscribe(channel, callback=callback, error=callback, + connect=connect, reconnect=reconnect, disconnect=disconnect) +``` + +#### History Example +``` +def callback(message): + print(message) + +pubnub.history(channel, count=2, callback=callback, error=callback) +``` + + +#### IO Event Loop start +``` +pubnub.start() +``` \ No newline at end of file diff --git a/python-twisted/migration.md b/python-twisted/migration.md new file mode 100644 index 0000000..10d03ae --- /dev/null +++ b/python-twisted/migration.md @@ -0,0 +1,164 @@ +## PubNub 3.5.0 Web Data Push Cloud-hosted API - PYTHON +#### www.pubnub.com - PubNub Web Data Push Service in the Cloud. +#### http://github.com/pubnub/python + + +#### Init + + + +``` + +# Pre 3.5: +# + +# New in 3.5+ +pubnub = Pubnub(publish_key="demo", subscribe_key="demo", ssl_on=False) + +``` + +#### PUBLISH + +``` +channel = 'hello_world' +message = 'Hello World !!!' + +# Pre 3.5: +# + +# New in 3.5+ + +# Synchronous usage +print pubnub.publish(channel='hello_world', message='Hello World !!!') + +# Asynchronous usage + +def callback(message): + print(message) + +pubnub.publish(channel, message, callback=callback, error=callback) + +``` + + +#### SUBSCRIBE +Pre 3.5.x, subscribe was blocking and would only be terminated via a false return from the callback. In our latest version of the SDK, subscribe is asyncronous, and because of this, usage is a bit different, but the experience is more like our other async SDKs. + +``` + +# Listen for Messages + +channel = 'hello_world' + +# Pre 3.5: +# + +# New in 3.5+ + +def callback(message, channel): + print(message) + + +def error(message): + print("ERROR : " + str(message)) + + +def connect(message): + print("CONNECTED") + + +def reconnect(message): + print("RECONNECTED") + + +def disconnect(message): + print("DISCONNECTED") + + +pubnub.subscribe(channel, callback=callback, error=callback, + connect=connect, reconnect=reconnect, disconnect=disconnect) +``` + +#### Unsubscribe +Once subscribed, you can easily, gracefully, unsubscribe: + +``` +# Pre 3.5: +# + +# New in 3.5+ + +Unsub example +``` + +#### PRESENCE + +``` + +# Pre 3.5: +# + +# New in 3.5+ + +# Listen for Presence Event Messages + +channel = 'hello_world' + +def callback(message, channel): + print(message) + + +def error(message): + print("ERROR : " + str(message)) + + + +pubnub.presence(channel, callback=callback, error=callback) +``` + +#### HERE_NOW + +``` + +# Pre 3.5: +# + +# New in 3.5+ + +# Get info on who is here right now! + +channel = 'hello_world' + +# Synchronous usage +print pubnub.here_now(channel) + + +# Asynchronous usage + +def callback(message): + print(message) + +pubnub.here_now(channel, callback=callback, error=callback) +``` + +#### HISTORY + +``` + +# Pre 3.5: +# + +# New in 3.5+ + +# Synchronous usage + +print pubnub.history(channel, count=2) + +# Asynchronous usage + + +def callback(message): + print(message) + +pubnub.history(channel, count=2, callback=callback, error=callback) +``` -- cgit v1.2.3 From 2419ac0419fe74b582b94ed7784b3732049db9f2 Mon Sep 17 00:00:00 2001 From: Devendra Date: Tue, 17 Jun 2014 03:27:05 +0530 Subject: readme changes --- python-twisted/README.md | 14 +++++++ python-twisted/migration.md | 97 +++++++++++++++++++++++++++++++-------------- 2 files changed, 82 insertions(+), 29 deletions(-) (limited to 'python-twisted') diff --git a/python-twisted/README.md b/python-twisted/README.md index 47045f5..2abefd5 100644 --- a/python-twisted/README.md +++ b/python-twisted/README.md @@ -10,6 +10,20 @@ from Pubnub import PubnubTwisted as Pubnub #### Init pubnub = Pubnub(publish_key="demo", subscribe_key="demo", ssl_on=False) +#### Publish Example +``` +channel = 'hello_world' +message = 'Hello World !!!' + +# Asynchronous usage + + +def callback(message): + print(message) + +pubnub.publish(channel, message, callback=callback, error=callback) +``` + #### IO Event Loop ##### VERY IMPORTANT TO ADD THIS LINE AT THE VERY BOTTOM! diff --git a/python-twisted/migration.md b/python-twisted/migration.md index 10d03ae..fcde163 100644 --- a/python-twisted/migration.md +++ b/python-twisted/migration.md @@ -2,15 +2,28 @@ #### www.pubnub.com - PubNub Web Data Push Service in the Cloud. #### http://github.com/pubnub/python +#### Import -#### Init +``` +# Pre 3.5: +from Pubnub import Pubnub +# New in 3.5+ +from Pubnub import PubnubTwisted as Pubnub + +``` +#### Init + ``` # Pre 3.5: -# +pubnub = Pubnub( + "demo", ## PUBLISH_KEY + "demo", ## SUBSCRIBE_KEY + False ## SSL_ON? +) # New in 3.5+ pubnub = Pubnub(publish_key="demo", subscribe_key="demo", ssl_on=False) @@ -24,14 +37,16 @@ channel = 'hello_world' message = 'Hello World !!!' # Pre 3.5: -# - -# New in 3.5+ +def callback(messages): + print(messages) -# Synchronous usage -print pubnub.publish(channel='hello_world', message='Hello World !!!') +pubnub.publish( { + 'channel' : channel, + 'message' : message, + 'callback' : callback +}) -# Asynchronous usage +# New in 3.5+ def callback(message): print(message) @@ -42,7 +57,6 @@ pubnub.publish(channel, message, callback=callback, error=callback) #### SUBSCRIBE -Pre 3.5.x, subscribe was blocking and would only be terminated via a false return from the callback. In our latest version of the SDK, subscribe is asyncronous, and because of this, usage is a bit different, but the experience is more like our other async SDKs. ``` @@ -51,7 +65,17 @@ Pre 3.5.x, subscribe was blocking and would only be terminated via a false retur channel = 'hello_world' # Pre 3.5: -# +def connected() : + print('CONNECTED') + +def message_received(message): + print(message) + +pubnub.subscribe({ + 'channel' : channel, + 'connect' : connected, + 'callback' : message_received +}) # New in 3.5+ @@ -84,11 +108,13 @@ Once subscribed, you can easily, gracefully, unsubscribe: ``` # Pre 3.5: -# +pubnub.unsubscribe({ + 'channel' : 'hello_world' +}) # New in 3.5+ -Unsub example +pubnub.unsubscribe(channel='hello_world') ``` #### PRESENCE @@ -111,8 +137,6 @@ def callback(message, channel): def error(message): print("ERROR : " + str(message)) - - pubnub.presence(channel, callback=callback, error=callback) ``` @@ -120,20 +144,22 @@ pubnub.presence(channel, callback=callback, error=callback) ``` -# Pre 3.5: -# +channel = 'hello_world' -# New in 3.5+ +# Pre 3.5: +def callback(messages): + print(messages) -# Get info on who is here right now! +pubnub.here_now( { + 'channel' : channel, + 'callback' : callback +}) -channel = 'hello_world' -# Synchronous usage -print pubnub.here_now(channel) +# New in 3.5+ +# Get info on who is here right now! -# Asynchronous usage def callback(message): print(message) @@ -144,21 +170,34 @@ pubnub.here_now(channel, callback=callback, error=callback) #### HISTORY ``` +channel = 'hello_world' # Pre 3.5: -# - -# New in 3.5+ +def history_complete(messages): + print(messages) -# Synchronous usage +pubnub.history( { + 'channel' : channel, + 'limit' : 2, + 'callback' : history_complete +}) -print pubnub.history(channel, count=2) - -# Asynchronous usage +# New in 3.5+ def callback(message): print(message) pubnub.history(channel, count=2, callback=callback, error=callback) ``` + +#### IO Event Loop + +``` + +# Pre 3.5: +reactor.run() + +# New in 3.5+ +pubnub.start() +``` -- cgit v1.2.3 From 0c90b0ce532d01e3a2232a8416362923bb76f3f5 Mon Sep 17 00:00:00 2001 From: Devendra Date: Tue, 17 Jun 2014 03:37:51 +0530 Subject: readme change --- python-twisted/README.md | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'python-twisted') diff --git a/python-twisted/README.md b/python-twisted/README.md index 2abefd5..ef56afb 100644 --- a/python-twisted/README.md +++ b/python-twisted/README.md @@ -8,7 +8,9 @@ from Pubnub import PubnubTwisted as Pubnub ``` #### Init +``` pubnub = Pubnub(publish_key="demo", subscribe_key="demo", ssl_on=False) +``` #### Publish Example ``` @@ -24,7 +26,6 @@ def callback(message): pubnub.publish(channel, message, callback=callback, error=callback) ``` - #### IO Event Loop ##### VERY IMPORTANT TO ADD THIS LINE AT THE VERY BOTTOM! @@ -68,6 +69,32 @@ def callback(message): pubnub.history(channel, count=2, callback=callback, error=callback) ``` +#### Here Now Example +``` +def callback(message): + print(message) + +pubnub.here_now(channel, callback=callback, error=callback) +``` + +#### Presence Example +``` +channel = 'hello_world' + +def callback(message, channel): + print(message) + + +def error(message): + print("ERROR : " + str(message)) + +pubnub.presence(channel, callback=callback, error=callback) +``` + +#### Unsubscribe Example +``` +pubnub.unsubscribe(channel='hello_world') +``` #### IO Event Loop start ``` -- cgit v1.2.3 From a66d137b3b98928786c7e70cfcda87cf4c996be8 Mon Sep 17 00:00:00 2001 From: Geremy Cohen Date: Mon, 16 Jun 2014 15:45:32 -0700 Subject: Update README.md --- python-twisted/README.md | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'python-twisted') diff --git a/python-twisted/README.md b/python-twisted/README.md index ef56afb..ea4173c 100644 --- a/python-twisted/README.md +++ b/python-twisted/README.md @@ -1,6 +1,14 @@ -## PubNub 3.5.0 Web Data Push Cloud-hosted API - PYTHON TWISTED -#### www.pubnub.com - PubNub Web Data Push Service in the Cloud. -#### http://github.com/pubnub/python +## Contact support@pubnub.com for all questions + +#### [PubNub](http://www.pubnub.com) Real-time Data Network +##### Twisted Client + +## IO Event Loop +Be sure to eventually start the event loop or PubNub won't run! + +``` +pubnub.start() +``` #### Import ``` @@ -26,13 +34,6 @@ def callback(message): pubnub.publish(channel, message, callback=callback, error=callback) ``` -#### IO Event Loop -##### VERY IMPORTANT TO ADD THIS LINE AT THE VERY BOTTOM! - -``` -pubnub.start() -``` - #### Subscribe Example ``` channel = 'hello_world' @@ -99,4 +100,6 @@ pubnub.unsubscribe(channel='hello_world') #### IO Event Loop start ``` pubnub.start() -``` \ No newline at end of file +``` + +## Contact support@pubnub.com for all questions -- cgit v1.2.3 From 34c4843b766a80df4b60f996fcd5cbc65d361158 Mon Sep 17 00:00:00 2001 From: Geremy Cohen Date: Mon, 16 Jun 2014 16:06:28 -0700 Subject: Update migration.md --- python-twisted/migration.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'python-twisted') diff --git a/python-twisted/migration.md b/python-twisted/migration.md index fcde163..49de5a9 100644 --- a/python-twisted/migration.md +++ b/python-twisted/migration.md @@ -1,6 +1,7 @@ -## PubNub 3.5.0 Web Data Push Cloud-hosted API - PYTHON -#### www.pubnub.com - PubNub Web Data Push Service in the Cloud. -#### http://github.com/pubnub/python +## Contact support@pubnub.com for all questions + +#### [PubNub](http://www.pubnub.com) Real-time Data Network +##### Twisted Migration #### Import @@ -201,3 +202,4 @@ reactor.run() # New in 3.5+ pubnub.start() ``` +## Contact support@pubnub.com for all questions -- cgit v1.2.3