This commit is contained in:
Tobias Oberstein
2016-05-01 17:32:20 +02:00
parent 81f693d33c
commit e1556d0501
9 changed files with 25 additions and 453 deletions

View File

@@ -176,7 +176,7 @@ Additionally, install [SCons](http://scons.org/).
#### Test
To generate and publish the documentation to [here](http://autobahn.ws/python/):
To generate and publish the documentation to [here](http://autobahn-python.readthedocs.io/en/latest/):
```
cd ~/scm/autobahn/AutobahnPython
@@ -190,7 +190,7 @@ and open [http://localhost:8080](http://localhost:8080).
#### Publish
To generate and publish the documentation to [here](http://autobahn.ws/python/):
To generate and publish the documentation to [here](http://autobahn-python.readthedocs.io/en/latest/):
```
cd ~/scm/autobahn/AutobahnPython
@@ -312,8 +312,8 @@ aws --region eu-west-1 s3 sync \
After the upload has finished, check the live pages:
* [Client Mode Reports](http://autobahn.ws/python/testreport/clients/index.html)
* [Server Mode Reports](http://autobahn.ws/python/testreport/servers/index.html)
* [Client Mode Reports](http://autobahn-python.readthedocs.io/en/latest/testreport/clients/index.html)
* [Server Mode Reports](http://autobahn-python.readthedocs.io/en/latest/testreport/servers/index.html)
## Roadmap

View File

@@ -3,43 +3,43 @@ Autobahn\|Python
WebSocket & WAMP for Python on Twisted and asyncio.
| |Version| |Downloads| |Build Status| |Coverage|
| |Version| |Downloads| |Build Status| |Coverage| |Docs|
--------------
| **Quick Links**: `Source Code <https://github.com/crossbario/autobahn-python>`__ - `Documentation <http://autobahn.ws/python>`__ - `WebSocket Examples <http://autobahn.ws/python/websocket/examples.html>`__ - `WAMP Examples <http://autobahn.ws/python/wamp/examples.html>`__
| **Quick Links**: `Source Code <https://github.com/crossbario/autobahn-python>`__ - `Documentation <https://autobahn-python.readthedocs.io/en/latest/>`__ - `WebSocket Examples <https://autobahn-python.readthedocs.io/en/latest/websocket/examples.html>`__ - `WAMP Examples <https://autobahn-python.readthedocs.io/en/latest/wamp/examples.html>`__
| **Community**: `Mailing list <http://groups.google.com/group/autobahnws>`__ - `StackOverflow <http://stackoverflow.com/questions/tagged/autobahn>`__ - `Twitter <https://twitter.com/autobahnws>`__ - `IRC #autobahn/chat.freenode.net <https://webchat.freenode.net/>`__
| **Companion Projects**: `Autobahn|JS <https://github.com/crossbario/autobahn-js/>`__ - `Autobahn|Cpp <https://github.com/crossbario/autobahn-cpp>`__ - `Autobahn|Testsuite <https://github.com/crossbario/autobahn-testsuite>`__ - `Crossbar.io <http://crossbar.io>`__ - `WAMP <http://wamp.ws>`__
Introduction
------------
**Autobahn\|Python** is a subproject of `Autobahn <http://autobahn.ws/>`__ and provides open-source
**Autobahn\|Python** is a subproject of `Autobahn <http://crossbar.io/autobahn>`__ and provides open-source
implementations of
- `The WebSocket Protocol <http://tools.ietf.org/html/rfc6455>`__
- `The Web Application Messaging Protocol (WAMP) <http://wamp.ws/>`__
- `The Web Application Messaging Protocol (WAMP) <http://wamp-proto.org/>`__
for Python 2 and 3, and running on `Twisted <http://twistedmatrix.com/>`__ and `asyncio <http://docs.python.org/3.4/library/asyncio.html>`__.
You can use **Autobahn\|Python** to create clients and servers in Python speaking just plain WebSocket or WAMP.
**WebSocket** allows `bidirectional real-time messaging on the Web <http://crossbario.com/blog/post/websocket-why-what-can-i-use-it/>`__ and beyond, while `WAMP <http://wamp.ws/>`__ adds real-time application communication on top of WebSocket.
**WebSocket** allows `bidirectional real-time messaging on the Web <http://crossbario.com/blog/post/websocket-why-what-can-i-use-it/>`__ and beyond, while `WAMP <http://wamp-proto.org/>`__ adds real-time application communication on top of WebSocket.
**WAMP** provides asynchronous **Remote Procedure Calls** and **Publish & Subscribe** for applications in *one* protocol running over `WebSocket <http://tools.ietf.org/html/rfc6455>`__. WAMP is a *routed* protocol, so you need a **WAMP Router** to connect your **Autobahn\|Python** based clients. We provide `Crossbar.io <http://crossbar.io>`__, but there are `other options <http://wamp.ws/implementations/#routers>`__ as well.
**WAMP** provides asynchronous **Remote Procedure Calls** and **Publish & Subscribe** for applications in *one* protocol running over `WebSocket <http://tools.ietf.org/html/rfc6455>`__. WAMP is a *routed* protocol, so you need a **WAMP Router** to connect your **Autobahn\|Python** based clients. We provide `Crossbar.io <http://crossbar.io>`__, but there are `other options <http://wamp-proto.org/implementations/#routers>`__ as well.
Features
--------
- framework for `WebSocket <http://tools.ietf.org/html/rfc6455>`__ and `WAMP <http://wamp.ws/>`__ clients and servers
- framework for `WebSocket <http://tools.ietf.org/html/rfc6455>`__ and `WAMP <http://wamp-proto.org/>`__ clients and servers
- compatible with Python 2.6, 2.7, 3.3 and 3.4
- runs on `CPython <http://python.org/>`__, `PyPy <http://pypy.org/>`__ and `Jython <http://jython.org/>`__
- runs under `Twisted <http://twistedmatrix.com/>`__ and `asyncio <http://docs.python.org/3.4/library/asyncio.html>`__ - implements WebSocket
`RFC6455 <http://tools.ietf.org/html/rfc6455>`__ and Draft Hybi-10+
- implements `WebSocket compression <http://tools.ietf.org/html/draft-ietf-hybi-permessage-compression>`__
- implements `WAMP <http://wamp.ws/>`__, the Web Application Messaging Protocol
- implements `WAMP <http://wamp-proto.org/>`__, the Web Application Messaging Protocol
- high-performance, fully asynchronous implementation
- best-in-class standards conformance (100% strict passes with `Autobahn Testsuite <http://autobahn.ws/testsuite>`__: `Server Test Report <http://autobahn.ws/python/testreport/servers/index.html>`__ / `Client Test Report <http://autobahn.ws/python/testreport/clients/index.html>`__)
- best-in-class standards conformance (100% strict passes with `Autobahn Testsuite <http://crossbar.io/autobahn#testsuite>`__)
- message-, frame- and streaming-APIs for WebSocket
- supports TLS (secure WebSocket) and proxies
- Open-source (`MIT license <https://github.com/crossbario/autobahn-python/blob/master/LICENSE>`__)
@@ -142,3 +142,6 @@ Above code will work on Twisted and asyncio by changing a single line
.. |Coverage| image:: https://img.shields.io/codecov/c/github/crossbario/autobahn-python/master.svg
:target: https://codecov.io/github/crossbario/autobahn-python
.. |Docs| image:: https://img.shields.io/badge/docs-latest-brightgreen.svg?style=flat
:target: https://autobahn-python.readthedocs.io/en/latest/

View File

@@ -2462,11 +2462,11 @@ class WebSocketServerProtocol(WebSocketProtocol):
if 'redirect' in self.http_request_params and len(self.http_request_params['redirect']) > 0:
# To specify an URL for redirection, encode the URL, i.e. from JavaScript:
#
# var url = encodeURIComponent("http://autobahn.ws/python");
# var url = encodeURIComponent("http://crossbar.io/autobahn");
#
# and append the encoded string as a query parameter 'redirect'
#
# http://localhost:9000?redirect=http%3A%2F%2Fautobahn.ws%2Fpython
# http://localhost:9000?redirect=http%3A%2F%2Fcrossbar.io%2Fautobahn
# https://localhost:9000?redirect=https%3A%2F%2Ftwitter.com%2F
#
# This will perform an immediate HTTP-303 redirection. If you provide

View File

@@ -1,97 +0,0 @@
{% extends "!layout.html" %}
{%- block extrahead %}
{{ super() }}
<link rel="stylesheet" href="{{ cstatic }}/css/tavendo.css">
<link rel="stylesheet" href="{{ cstatic }}/css/autobahn.css">
<style>
.navbar-brand {
width: 239px;
height: 50px;
}
.navbar-brand::after {
content: url({{ cstatic }}/img/gen/autobahnpython.svg.gz);
}
</style>
{% endblock %}
{% block footer %}
<footer class="footer">
<div class="container">
<div class="extendedFooter">
<div class="logoblock">
<p class="logo">
<a href="/"><img class="logo" src="{{ cstatic }}/img/gen/autobahn.svg.gz" height="200" width="200" alt="Autobahn|Python"/></a>
</p>
<h3 style="font-weight: normal;"><strong>Autobahn</strong>|Python</h3>
{% if not no_network %}
<p>
<iframe src="http://ghbtns.com/github-btn.html?user=crossbario&repo=autobahn-python&type=watch&count=true&size=large"
allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
</p>
{% else %}
<!-- GitHub stripped! -->
{% endif %}
</div>
<div class="side_toc sidebar_block" id="quicklinks">
<h4><a href="https://pypi.python.org/pypi/autobahn/">Download</a></h4>
<h4><a href="https://github.com/crossbario/autobahn-python">Source Code</a></h4>
<h4><a href="https://groups.google.com/forum/#!forum/autobahnws">Mailing List</a></h4>
<h4><a href="https://github.com/crossbario/autobahn-python/issues">Issue Tracker</a></h4>
<h4><a href="http://stackoverflow.com/questions/tagged/autobahn?sort=newest">StackOverflow</a></h4>
</div>
</div>
<p class="pull-right">
<a href="#">Back to top</a>
</p>
<p>
Copyright © 2011-2015 <a href="http://tavendo.com">Tavendo GmbH</a>. Content on this site is licensed under <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons CC-BY-SA</a>.
<br>
Tavendo, WAMP and "Autobahn WebSocket" are trademarks of <a href="http://tavendo.com">Tavendo GmbH</a>.
</p>
</div>
</footer>
{% if widgeturl %}
<!-- community widget iframe -->
<div id="cdn_widget"></div>
<script src="{{ widgeturl }}/js/communitywidget.js"></script>
<script>
if ('clandeck' in window) {
clandeck.create_widget({community: "tavendo", container: "cdn_widget", topOffset: "60px"});
}
</script>
{% else %}
<!-- community widget stripped! -->
{% endif %}
<a id="manifesto" href="http://www.reactivemanifesto.org/">
<!-- <img src="//d379ifj7s9wntv.cloudfront.net/reactivemanifesto/images/ribbons/we-are-reactive-black-right.png"> -->
<img src="{{ cstatic }}/img/gen/we_are_reactive.svg.gz" height="144" width="144" alt="Reactive Manifesto: We are reactive banner"/>
</a>
{% if not no_network %}
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-23019220-3', 'autobahn.ws');
ga('send', 'pageview');
</script>
{% else %}
<!-- Google Analytics stripped! -->
{% endif %}
{% endblock %}

View File

@@ -1,33 +0,0 @@
<div id="logoblock">
<p class="logo">
<a href="/"><img class="logo" src="{{ cstatic }}/img/gen/autobahn.svg.gz
" height="200" width="200" alt="Autobahn|Python"/></a>
</p>
<h3 style="font-weight: normal;"><strong>Autobahn</strong>|Python</h3>
{% if not no_network %}
<p>
<iframe src="http://ghbtns.com/github-btn.html?user=tavendo&repo=AutobahnPython&type=watch&count=true&size=large"
allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
</p>
{% else %}
<!-- GitHub stripped! -->
{% endif %}
</div>
<div class="side_toc sidebar_block" id="quicklinks">
<h4><a href="https://pypi.python.org/pypi/autobahn/">Download</a></h4>
<h4><a href="https://github.com/crossbario/autobahn-python">Source Code</a></h4>
<h4><a href="https://groups.google.com/forum/#!forum/autobahnws">Mailing List</a></h4>
<h4><a href="https://github.com/crossbario/autobahn-python/issues">Issue Tracker</a></h4>
<h4><a href="http://stackoverflow.com/questions/tagged/autobahn?sort=newest">StackOverflow</a></h4>
</div>
<div class="side_toc sidebar_block">
<hr>
<h4><a href="{{ pathto('contents') }}">{{ _('Site Contents') }}</a></h4>
<hr>
<h4>Page Contents</h4>
{{ toc }}
<hr>
<h4><a href="{{ pathto('reference/autobahn') }}">API Reference</a></h4>
<h4><a href="{{ pathto('genindex') }}">Index</a></h4>
</div>

View File

@@ -282,21 +282,18 @@ rst_epilog = """
.. |Ab| replace:: **Autobahn**
.. |abL| replace:: Autobahn|Python
.. |AbL| replace:: **Autobahn**\|Python
.. _Autobahn: http://autobahn.ws
.. _AutobahnJS: http://autobahn.ws/js
.. _Autobahn: http://crossbar.io/autobahn#python
.. _AutobahnJS: http://crossbar.io/autobahn#js
.. _AutobahnPython: **Autobahn**\|Python
.. _WebSocket: http://tools.ietf.org/html/rfc6455
.. _RFC6455: http://tools.ietf.org/html/rfc6455
.. _WAMP: http://wamp.ws/
.. _WAMP: http://wamp-proto.org/
.. _Twisted: http://twistedmatrix.com/
.. _asyncio: http://docs.python.org/3.4/library/asyncio.html
.. _CPython: http://python.org/
.. _PyPy: http://pypy.org/
.. _Jython: http://jython.org/
.. _WAMP: http://wamp.ws/
.. _WAMPv1: http://wamp.ws/spec/wamp1/
.. _WAMPv2: https://github.com/wamp-proto/wamp-proto/blob/master/spec/README.md
.. _AutobahnTestsuite: http://autobahn.ws/testsuite
.. _AutobahnTestsuite: http://crossbar.io/autobahn#testsuite
.. _trollius: https://pypi.python.org/pypi/trollius/
.. _tulip: https://pypi.python.org/pypi/asyncio/
"""

View File

@@ -1,298 +0,0 @@
# -*- coding: utf-8 -*-
import os
import sys
import sphinx_bootstrap_theme
# only needed for Autobahn|Python
sys.path.insert(0, os.path.abspath('./_extensions'))
sys.path.insert(0, os.path.abspath('..'))
# monkey-patch txaio so that we can "use" both twisted *and* asyncio,
# at least at import time -- this is so the autodoc stuff can
# successfully import autobahn.twisted.* as well as autobahn.asyncio.*
# (usually, you can only import one or the other in a single Python
# interpreter)
if True:
import txaio
def use_tx():
"monkey-patched for doc-building"
from txaio import tx
txaio._use_framework(tx)
def use_aio():
"monkey-patched for doc-building"
from txaio import aio
txaio._use_framework(aio)
txaio.use_twisted = use_tx
txaio.use_asyncio = use_aio
extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.doctest',
'sphinx.ext.intersphinx',
'sphinx.ext.viewcode',
'sphinx.ext.ifconfig',
'sphinx.ext.todo',
'sphinxcontrib.spelling',
'txsphinx' # only needed for Autobahn|Python
]
spelling_lang = 'en_US'
spelling_show_suggestions = False
spelling_word_list_filename = 'spelling_wordlist.txt'
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'AutobahnPython'
copyright = u'Tavendo GmbH'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir))
init = {}
with open(os.path.join(base_dir, "autobahn", "__init__.py")) as f:
exec(f.read(), init)
version = release = init["__version__"]
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build', 'work']
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
## Sphinx-Bootstrap Theme
##
## http://sphinx-bootstrap-theme.readthedocs.org/en/latest/README.html
##
html_theme = 'bootstrap'
html_theme_path = sphinx_bootstrap_theme.get_html_theme_path()
html_theme_options = {
# Navigation bar title. (Default: ``project`` value)
'navbar_title': " ",
# Tab name for entire site. (Default: "Site")
'navbar_site_name': "Site",
# A list of tuples containing pages or urls to link to.
# Valid tuples should be in the following forms:
# (name, page) # a link to a page
# (name, "/aa/bb", 1) # a link to an arbitrary relative url
# (name, "http://example.com", True) # arbitrary absolute url
# Note the "1" or "True" value above as the third argument to indicate
# an arbitrary url.
'navbar_links': [
#("Examples", "examples"),
#("Link", "http://example.com", True),
],
# Render the next and previous page links in navbar. (Default: true)
'navbar_sidebarrel': True,
# Render the current pages TOC in the navbar. (Default: true)
'navbar_pagenav': True,
# Tab name for the current pages TOC. (Default: "Page")
#'navbar_pagenav_name': "Page",
# Global TOC depth for "site" navbar tab. (Default: 1)
# Switching to -1 shows all levels.
'globaltoc_depth': 1,
# Include hidden TOCs in Site navbar?
#
# Note: If this is "false", you cannot have mixed ``:hidden:`` and
# non-hidden ``toctree`` directives in the same page, or else the build
# will break.
#
# Values: "true" (default) or "false"
'globaltoc_includehidden': "true",
# HTML navbar class (Default: "navbar") to attach to <div> element.
# For black navbar, do "navbar navbar-inverse"
#'navbar_class': "navbar navbar-inverse",
'navbar_class': "navbar",
# Fix navigation bar to top of page?
# Values: "true" (default) or "false"
'navbar_fixed_top': "true",
# Location of link to source.
# Options are "nav" (default), "footer" or anything else to exclude.
'source_link_position': "nav",
# Bootswatch (http://bootswatch.com/) theme.
#
# Options are nothing with "" (default) or the name of a valid theme
# such as "amelia" or "cosmo".
'bootswatch_theme': "",
# Choose Bootstrap version.
# Values: "3" (default) or "2" (in quotes)
'bootstrap_version': "3",
}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
## additional variables which become accessible in RST (e.g. .. ifconfig:: not no_network)
##
def setup(app):
app.add_config_value('no_network', False, True)
no_network = None
## additional variables which become accessible in the template engine's
## context for all pages
##
html_context = {
#'widgeturl': 'https://demo.crossbar.io/clandeckwidget'
#'widgeturl': 'http://127.0.0.1:8090/widget'
'widgeturl': None,
'no_network': False,
#'cstatic': 'http://127.0.0.1:8888',
'cstatic': '//tavendo-common-static.s3-eu-west-1.amazonaws.com',
}
# (Optional) Logo. Should be small enough to fit the navbar (ideally 24x24).
# Path should be relative to the ``_static`` files directory.
html_logo = None
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
html_sidebars = {
'**': [
'side-primary.html'
]
}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'AutobahnPython'
# http://sphinx-doc.org/ext/intersphinx.html
intersphinx_mapping = {
'py2': ('http://docs.python.org/2', None),
'py3': ('http://docs.python.org/3', None),
'six': ('https://pythonhosted.org/six/', None),
}
rst_epilog = """
.. |ab| replace:: Autobahn
.. |Ab| replace:: **Autobahn**
.. |abL| replace:: Autobahn|Python
.. |AbL| replace:: **Autobahn**\|Python
.. _Autobahn: http://autobahn.ws
.. _AutobahnJS: http://autobahn.ws/js
.. _AutobahnPython: **Autobahn**\|Python
.. _WebSocket: http://tools.ietf.org/html/rfc6455
.. _RFC6455: http://tools.ietf.org/html/rfc6455
.. _WAMP: http://wamp.ws/
.. _Twisted: http://twistedmatrix.com/
.. _asyncio: http://docs.python.org/3.4/library/asyncio.html
.. _CPython: http://python.org/
.. _PyPy: http://pypy.org/
.. _Jython: http://jython.org/
.. _WAMP: http://wamp.ws/
.. _WAMPv1: http://wamp.ws/spec/wamp1/
.. _WAMPv2: https://github.com/wamp-proto/wamp-proto/blob/master/spec/README.md
.. _AutobahnTestsuite: http://autobahn.ws/testsuite
.. _trollius: https://pypi.python.org/pypi/trollius/
.. _tulip: https://pypi.python.org/pypi/asyncio/
"""
rst_prolog = """
"""
# http://stackoverflow.com/questions/5599254/how-to-use-sphinxs-autodoc-to-document-a-classs-init-self-method
autoclass_content = 'both'
autodoc_member_order = 'bysource'

View File

@@ -30,7 +30,7 @@ Testee
`Twisted <https://github.com/crossbario/autobahn-python/blob/master/examples/twisted/websocket/testee>`__ / `asyncio <https://github.com/crossbario/autobahn-python/blob/master/examples/asyncio/websocket/testee>`__
The example implements a *testee* for testing against `Autobahn|Testsuite <http://autobahn.ws/testsuite>`_.
The example implements a *testee* for testing against `Autobahn|Testsuite <http://crossbar.io/autobahn#testsuite>`_.
-----------

View File

@@ -168,7 +168,7 @@ setup(
license='MIT License',
author='Tavendo GmbH',
author_email='autobahnws@googlegroups.com',
url='http://autobahn.ws/python',
url='http://crossbar.io/autobahn',
platforms='Any',
install_requires=[
'six>=1.10.0', # MIT license
@@ -224,7 +224,7 @@ setup(
"Topic :: Software Development :: Libraries",
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: Software Development :: Object Brokering"],
keywords='autobahn autobahn.ws websocket realtime rfc6455 wamp rpc pubsub twisted asyncio'
keywords='autobahn crossbar websocket realtime rfc6455 wamp rpc pubsub twisted asyncio'
)