diff --git a/CHANGES.rst b/CHANGES.md similarity index 81% rename from CHANGES.rst rename to CHANGES.md index 90ee4b2..c8895d7 100644 --- a/CHANGES.rst +++ b/CHANGES.md @@ -1,3 +1,9 @@ +0.5.4 +----- +- Fixed reconnection in the event of server restart +- Fixed calling on_reconnect() so that it is actually called +- Set default Namespace=None + 0.5.3 ----- - Updated wait loop to exit if the client wants to disconnect @@ -42,7 +48,5 @@ 0.1 --- -- Wrapped code from StackOverflow_ +- Wrapped code from [StackOverflow](http://stackoverflow.com/questions/6692908/formatting-messages-to-send-to-socket-io-node-js-server-from-python-client) - Added exception handling to destructor in case of connection failure - -.. _StackOverflow: http://stackoverflow.com/questions/6692908/formatting-messages-to-send-to-socket-io-node-js-server-from-python-client diff --git a/MANIFEST.in b/MANIFEST.in index 346209d..4396c68 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,3 @@ recursive-include socketIO_client * -include *.rst +include *.md global-exclude *.pyc diff --git a/README.md b/README.md new file mode 100644 index 0000000..a7a7152 --- /dev/null +++ b/README.md @@ -0,0 +1,156 @@ +socketIO-client +=============== +Here is a [socket.io](http://socket.io) client library for Python. You can use it to write test code for your socket.io server. + + +Installation +------------ +Install the package in an isolated environment. + + VIRTUAL_ENV=$HOME/.virtualenv + + # Prepare isolated environment + virtualenv $VIRTUAL_ENV + + # Activate isolated environment + source $VIRTUAL_ENV/bin/activate + + # Install package + pip install -U socketIO-client + + +Usage +----- +Activate isolated environment. + + VIRTUAL_ENV=$HOME/.virtualenv + source $VIRTUAL_ENV/bin/activate + +Launch the your socket.io server. + + node serve_tests.js + +For debugging information, run these commands first. + + import logging + logging.basicConfig(level=logging.DEBUG) + +Emit. + + from socketIO_client import SocketIO, LoggingNamespace + + with SocketIO('localhost', 8000, LoggingNamespace) as socketIO: + socketIO.emit('aaa') + socketIO.wait(seconds=1) + +Emit with callback. + + from socketIO_client import SocketIO, LoggingNamespace + + def on_bbb_response(*args): + print 'on_bbb_response', args + + with SocketIO('localhost', 8000, LoggingNamespace) as socketIO: + socketIO.emit('bbb', {'xxx': 'yyy'}, on_bbb_response) + socketIO.wait_for_callbacks(seconds=1) + +Define events. + + from socketIO_client import SocketIO, LoggingNamespace + + def on_aaa_response(*args): + print 'on_aaa_response', args + + socketIO = SocketIO('localhost', 8000, LoggingNamespace) + socketIO.on('aaa_response', on_aaa_response) + socketIO.emit('aaa') + socketIO.wait(seconds=1) + +Define events in a namespace. + + from socketIO_client import SocketIO, BaseNamespace + + class Namespace(BaseNamespace): + + def on_aaa_response(self, *args): + print 'on_aaa_response', args + self.emit('bbb') + + socketIO = SocketIO('localhost', 8000, Namespace) + socketIO.emit('aaa') + socketIO.wait(seconds=1) + +Define standard events. + + from socketIO_client import SocketIO, BaseNamespace + + class Namespace(BaseNamespace): + + def on_connect(self): + print '[Connected]' + + socketIO = SocketIO('localhost', 8000, Namespace) + socketIO.wait(seconds=1) + +Define different namespaces on a single socket. + + from socketIO_client import SocketIO, BaseNamespace + + class ChatNamespace(BaseNamespace): + + def on_aaa_response(self, *args): + print 'on_aaa_response', args + + class NewsNamespace(BaseNamespace): + + def on_aaa_response(self, *args): + print 'on_aaa_response', args + + socketIO = SocketIO('localhost', 8000) + chat_namespace = socketIO.define(ChatNamespace, '/chat') + news_namespace = socketIO.define(NewsNamespace, '/news') + + chat_namespace.emit('aaa') + news_namespace.emit('aaa') + socketIO.wait(seconds=1) + +Connect via SSL. + + from socketIO_client import SocketIO + + SocketIO('https://localhost', verify=False) + +Specify params, headers, cookies, proxies thanks to the [requests](http://python-requests.org) library. + + from socketIO_client import SocketIO + from base64 import b64encode + + SocketIO('localhost', 8000, + params={'q': 'qqq'}, + headers={'Authorization': 'Basic ' + b64encode('username:password')}, + cookies={'a': 'aaa'}, + proxies={'https': 'https://proxy.example.com:8080'}) + +Wait forever. + + from socketIO_client import SocketIO + + socketIO = SocketIO('localhost') + socketIO.wait() + + +License +------- +This software is available under the MIT License. + + +Credits +------- +- [Guillermo Rauch](https://github.com/guille) wrote the [socket.io specification](https://github.com/LearnBoost/socket.io-spec). +- [Hiroki Ohtani](https://github.com/liris) wrote [websocket-client](https://github.com/liris/websocket-client). +- [rod](http://stackoverflow.com/users/370115/rod) wrote a [prototype for a Python client to a socket.io server](http://stackoverflow.com/questions/6692908/formatting-messages-to-send-to-socket-io-node-js-server-from-python-client) on StackOverflow. +- [Alexandre Bourget](https://github.com/abourget) wrote [gevent-socketio](https://github.com/abourget/gevent-socketio), which is a socket.io server written in Python. +- [Paul Kienzle](https://github.com/pkienzle), [Zac Lee](https://github.com/zratic), [Josh VanderLinden](https://github.com/codekoala), [Ian Fitzpatrick](https://github.com/GraphEffect), [Lucas Klein](https://github.com/lukashed), [Rui Chicoria](https://github.com/rchicoria), [Travis Odom](https://github.com/burstaholic), [Patrick Huber](https://github.com/stackmagic), [Brad Campbell](https://github.com/bradjc), [Daniel](https://github.com/dabidan), [Sean Arietta](https://github.com/sarietta) submitted code to expand support of the socket.io protocol. +- [Bernard Pratz](https://github.com/guyzmo), [Francis Bull](https://github.com/franbull) wrote prototypes to support xhr-polling and jsonp-polling. +- [Eric Chen](https://github.com/taiyangc), [Denis Zinevich](https://github.com/dzinevich), [Thiago Hersan](https://github.com/thiagohersan), [Nayef Copty](https://github.com/nayefc), [Jörgen Karlsson](https://github.com/jorgen-k), [Branden Ghena](https://github.com/brghena) suggested ways to make the connection more robust. +- [Merlijn van Deen](https://github.com/valhallasw), [Frederic Sureau](https://github.com/fredericsureau), [Marcus Cobden](https://github.com/leth), [Drew Hutchison](https://github.com/drewhutchison), [wuurrd](https://github.com/wuurrd), [Adam Kecer](https://github.com/amfg), [Alex Monk](https://github.com/Krenair), [Vishal](https://github.com/vishalwy), [John Vandenberg](https://github.com/jayvdb) proposed changes that make the library more friendly and practical for you! diff --git a/README.rst b/README.rst deleted file mode 100644 index cd5bb11..0000000 --- a/README.rst +++ /dev/null @@ -1,183 +0,0 @@ -socketIO-client -=============== -Here is a socket.io_ client library for Python. You can use it to write test code for your socket.io_ server. - - -Installation ------------- -:: - - VIRTUAL_ENV=$HOME/.virtualenv - - # Prepare isolated environment - virtualenv $VIRTUAL_ENV - - # Activate isolated environment - source $VIRTUAL_ENV/bin/activate - - # Install package - pip install -U socketIO-client - - -Usage ------ -Activate isolated environment. :: - - VIRTUAL_ENV=$HOME/.virtualenv - source $VIRTUAL_ENV/bin/activate - -For debugging information, run these commands first. :: - - import logging - logging.basicConfig(level=logging.DEBUG) - -Emit. :: - - from socketIO_client import SocketIO - - with SocketIO('localhost', 8000) as socketIO: - socketIO.emit('aaa') - socketIO.wait(seconds=1) - -Emit with callback. :: - - from socketIO_client import SocketIO - - def on_bbb_response(*args): - print 'on_bbb_response', args - - with SocketIO('localhost', 8000) as socketIO: - socketIO.emit('bbb', {'xxx': 'yyy'}, on_bbb_response) - socketIO.wait_for_callbacks(seconds=1) - -Define events. :: - - from socketIO_client import SocketIO - - def on_aaa_response(*args): - print 'on_aaa_response', args - - socketIO = SocketIO('localhost', 8000) - socketIO.on('aaa_response', on_aaa_response) - socketIO.emit('aaa') - socketIO.wait(seconds=1) - -Define events in a namespace. :: - - from socketIO_client import SocketIO, BaseNamespace - - class Namespace(BaseNamespace): - - def on_aaa_response(self, *args): - print 'on_aaa_response', args - self.emit('bbb') - - socketIO = SocketIO('localhost', 8000, Namespace) - socketIO.emit('aaa') - socketIO.wait(seconds=1) - -Define standard events. :: - - from socketIO_client import SocketIO, BaseNamespace - - class Namespace(BaseNamespace): - - def on_connect(self): - print '[Connected]' - - socketIO = SocketIO('localhost', 8000, Namespace) - socketIO.wait(seconds=1) - -Define different namespaces on a single socket. :: - - from socketIO_client import SocketIO, BaseNamespace - - class ChatNamespace(BaseNamespace): - - def on_aaa_response(self, *args): - print 'on_aaa_response', args - - class NewsNamespace(BaseNamespace): - - def on_aaa_response(self, *args): - print 'on_aaa_response', args - - socketIO = SocketIO('localhost', 8000) - chat_namespace = socketIO.define(ChatNamespace, '/chat') - news_namespace = socketIO.define(NewsNamespace, '/news') - - chat_namespace.emit('aaa') - news_namespace.emit('aaa') - socketIO.wait(seconds=1) - -Connect via SSL. :: - - from socketIO_client import SocketIO - - SocketIO('https://localhost') - -Specify params, headers, cookies, proxies thanks to the `requests`_ library. :: - - from socketIO_client import SocketIO - from base64 import b64encode - - SocketIO('localhost', 8000, - resource='my.io', - params={'q': 'qqq'}, - headers={'Authorization': 'Basic ' + b64encode('username:password')}, - cookies={'a': 'aaa'}, - proxies={'https': 'https://proxy.example.com:8080'}) - -Wait forever. :: - - from socketIO_client import SocketIO - - socketIO = SocketIO('localhost') - socketIO.wait() - - -License -------- -This software is available under the MIT License. - - -Credits -------- -- `Guillermo Rauch`_ wrote the `socket.io specification`_. -- `Hiroki Ohtani`_ wrote websocket-client_. -- rod_ wrote a `prototype for a Python client to a socket.io server`_ on StackOverflow. -- `Alexandre Bourget`_ wrote gevent-socketio_, which is a socket.io server written in Python. -- `Paul Kienzle`_, `Zac Lee`_, `Josh VanderLinden`_, `Ian Fitzpatrick`_, `Lucas Klein`_, `Rui Chicoria`_, `Travis Odom`_ submitted code to expand support of the socket.io protocol. -- `Bernard Pratz`_ and `Francis Bull`_ wrote prototypes to support xhr-polling and jsonp-polling. -- `Eric Chen`_, `Denis Zinevich`_, `Thiago Hersan`_, `Nayef Copty`_ suggested ways to make the connection more robust. - - -.. _socket.io: http://socket.io -.. _requests: http://python-requests.org - -.. _Guillermo Rauch: https://github.com/guille -.. _socket.io specification: https://github.com/LearnBoost/socket.io-spec - -.. _Hiroki Ohtani: https://github.com/liris -.. _websocket-client: https://github.com/liris/websocket-client - -.. _rod: http://stackoverflow.com/users/370115/rod -.. _prototype for a Python client to a socket.io server: http://stackoverflow.com/questions/6692908/formatting-messages-to-send-to-socket-io-node-js-server-from-python-client - -.. _Alexandre Bourget: https://github.com/abourget -.. _gevent-socketio: https://github.com/abourget/gevent-socketio - -.. _Bernard Pratz: https://github.com/guyzmo -.. _Francis Bull: https://github.com/franbull -.. _Paul Kienzle: https://github.com/pkienzle -.. _Zac Lee: https://github.com/zratic -.. _Josh VanderLinden: https://github.com/codekoala -.. _Ian Fitzpatrick: https://github.com/GraphEffect -.. _Lucas Klein: https://github.com/lukashed -.. _Rui Chicoria: https://github.com/rchicoria -.. _Travis Odom: https://github.com/burstaholic -.. _Eric Chen: https://github.com/taiyangc -.. _Denis Zinevich: https://github.com/dzinevich -.. _Thiago Hersan: https://github.com/thiagohersan -.. _Nayef Copty: https://github.com/nayefc -.. _Patrick Huber: https://github.com/stackmagic diff --git a/setup.py b/setup.py index c26f2af..ced54e6 100644 --- a/setup.py +++ b/setup.py @@ -4,8 +4,8 @@ from socketIO_client import __version__ here = os.path.abspath(os.path.dirname(__file__)) -README = open(os.path.join(here, 'README.rst')).read() -CHANGES = open(os.path.join(here, 'CHANGES.rst')).read() +README = open(os.path.join(here, 'README.md')).read() +CHANGES = open(os.path.join(here, 'CHANGES.md')).read() setup( diff --git a/socketIO_client/__init__.py b/socketIO_client/__init__.py index 3105a13..3624484 100644 --- a/socketIO_client/__init__.py +++ b/socketIO_client/__init__.py @@ -9,7 +9,7 @@ except ImportError: from urlparse import urlparse as parse_url from .exceptions import ( - ConnectionError, TimeoutError, PacketError, SocketIOError) + SocketIOError, ConnectionError, TimeoutError, PacketError) from .transports import ( _get_response, TRANSPORTS, _WebsocketTransport, _XHR_PollingTransport, _JSONP_PollingTransport) @@ -182,11 +182,10 @@ class SocketIO(object): - Define the behavior of the client by specifying a custom Namespace. - Prefix host with https:// to use SSL. - Set wait_for_connection=True to block until we have a connection. - - Specify the transports you want to use. + - Specify desired transports=['websocket', 'xhr-polling']. - Pass query params, headers, cookies, proxies as keyword arguments. SocketIO('localhost', 8000, - resource='my.io', params={'q': 'qqq'}, headers={'Authorization': 'Basic ' + b64encode('username:password')}, cookies={'a': 'aaa'}, @@ -390,7 +389,7 @@ class SocketIO(object): try: return self._namespace_by_path[path] except KeyError: - raise PacketError('unexpected namespace path (%s)' % path) + raise PacketError('unhandled namespace path (%s)' % path) def _get_delegate(self, code): try: