257 lines
9.2 KiB
Python
257 lines
9.2 KiB
Python
###############################################################################
|
|
#
|
|
# The MIT License (MIT)
|
|
#
|
|
# Copyright (c) Crossbar.io Technologies GmbH
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
# of this software and associated documentation files (the "Software"), to deal
|
|
# in the Software without restriction, including without limitation the rights
|
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
# copies of the Software, and to permit persons to whom the Software is
|
|
# furnished to do so, subject to the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be included in
|
|
# all copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
# THE SOFTWARE.
|
|
#
|
|
###############################################################################
|
|
|
|
from __future__ import absolute_import
|
|
|
|
import os
|
|
import sys
|
|
import platform
|
|
from setuptools import setup
|
|
from setuptools.command.test import test as test_command
|
|
|
|
# remember if we already had six _before_ installation
|
|
try:
|
|
import six # noqa
|
|
_HAD_SIX = True
|
|
except ImportError:
|
|
_HAD_SIX = False
|
|
|
|
CPY = platform.python_implementation() == 'CPython'
|
|
PY3 = sys.version_info >= (3,)
|
|
PY33 = (3, 3) <= sys.version_info < (3, 4)
|
|
|
|
# read version string
|
|
with open('autobahn/_version.py') as f:
|
|
exec(f.read()) # defines __version__
|
|
|
|
# read package long description
|
|
with open('README.rst') as f:
|
|
docstr = f.read()
|
|
|
|
# Twisted dependencies (be careful bumping these minimal versions,
|
|
# as we make claims to support older Twisted!)
|
|
extras_require_twisted = [
|
|
"zope.interface>=3.6.0", # Zope Public License
|
|
"Twisted >= 12.1.0" # MIT license
|
|
]
|
|
|
|
# asyncio dependencies
|
|
if PY3:
|
|
if PY33:
|
|
# "Tulip"
|
|
extras_require_asyncio = [
|
|
"asyncio>=3.4.3" # Apache 2.0
|
|
]
|
|
else:
|
|
# Python 3.4+ has asyncio builtin
|
|
extras_require_asyncio = []
|
|
else:
|
|
# backport of asyncio for Python 2
|
|
extras_require_asyncio = [
|
|
"trollius>=2.0", # Apache 2.0
|
|
"futures>=3.0.4" # BSD license
|
|
]
|
|
|
|
# C-based WebSocket acceleration (only use on CPython, not PyPy!)
|
|
if CPY and sys.platform != 'win32':
|
|
# wsaccel does not provide wheels: https://github.com/methane/wsaccel/issues/12
|
|
extras_require_accelerate = [
|
|
"wsaccel>=0.6.2" # Apache 2.0
|
|
]
|
|
else:
|
|
extras_require_accelerate = []
|
|
|
|
# non-standard WebSocket compression support (FIXME: consider removing altogether)
|
|
# Ubuntu: sudo apt-get install libsnappy-dev
|
|
# lz4: do we need that anyway?
|
|
extras_require_compress = [
|
|
"python-snappy>=0.5", # BSD license
|
|
"lz4>=0.7.0" # BSD license
|
|
]
|
|
|
|
# non-JSON WAMP serialization support (namely MsgPack, CBOR and UBJSON)
|
|
os.environ['PYUBJSON_NO_EXTENSION'] = '1' # enforce use of pure Python py-ubjson (no Cython)
|
|
extras_require_serialization = [
|
|
"u-msgpack-python>=2.1", # MIT license
|
|
"cbor>=1.0.0", # Apache 2.0 license
|
|
"py-ubjson>=0.8.4" # Apache 2.0 license
|
|
]
|
|
|
|
# payload encryption (required for WAMP-cryptosign support!)
|
|
os.environ['SODIUM_INSTALL'] = 'bundled' # enforce use of bundled libsodium
|
|
extras_require_encryption = [
|
|
'pynacl>=1.0.1', # Apache license
|
|
'pytrie>=0.2', # BSD license
|
|
'pyqrcode>=1.1' # BSD license
|
|
]
|
|
|
|
# everything
|
|
extras_require_all = extras_require_twisted + extras_require_asyncio + \
|
|
extras_require_accelerate + extras_require_compress + \
|
|
extras_require_serialization + extras_require_encryption
|
|
|
|
# extras_require_all += extras_require_compress
|
|
|
|
# development dependencies
|
|
extras_require_dev = [
|
|
# flake8 will install the version "it needs"
|
|
# "pep8>=1.6.2", # MIT license
|
|
"pep8-naming>=0.3.3", # MIT license
|
|
"flake8>=2.5.1", # MIT license
|
|
"pyflakes>=1.0.0", # MIT license
|
|
"mock>=1.3.0", # BSD license
|
|
"pytest>=2.8.6", # MIT license
|
|
"unittest2>=1.1.0", # BSD license
|
|
"twine>=1.6.5", # Apache 2.0
|
|
'sphinx>=1.2.3', # BSD
|
|
'pyenchant>=1.6.6', # LGPL
|
|
'sphinxcontrib-spelling>=2.1.2', # BSD
|
|
'sphinx_rtd_theme>=0.1.9', # BSD
|
|
'pytest_asyncio',
|
|
]
|
|
|
|
# for testing by users with "python setup.py test" (not Tox, which we use)
|
|
test_requirements = [
|
|
"pytest>=2.8.6", # MIT license
|
|
"mock>=1.3.0", # BSD license
|
|
]
|
|
|
|
|
|
class PyTest(test_command):
|
|
"""
|
|
pytest integration for setuptools.
|
|
|
|
see:
|
|
- http://pytest.org/latest/goodpractises.html#integration-with-setuptools-test-commands
|
|
- https://github.com/pyca/cryptography/pull/678/files
|
|
"""
|
|
|
|
def finalize_options(self):
|
|
test_command.finalize_options(self)
|
|
self.test_args = []
|
|
self.test_suite = True
|
|
|
|
def run_tests(self):
|
|
# Import here because in module scope the eggs are not loaded.
|
|
import pytest
|
|
errno = pytest.main(self.test_args)
|
|
sys.exit(errno)
|
|
|
|
|
|
setup(
|
|
name='autobahn',
|
|
version=__version__,
|
|
description='WebSocket client & server library, WAMP real-time framework',
|
|
long_description=docstr,
|
|
license='MIT License',
|
|
author='Crossbar.io Technologies GmbH',
|
|
url='http://crossbar.io/autobahn',
|
|
platforms='Any',
|
|
install_requires=[
|
|
'six>=1.10.0', # MIT license
|
|
'txaio>=2.5.2', # MIT license
|
|
],
|
|
extras_require={
|
|
'all': extras_require_all,
|
|
'asyncio': extras_require_asyncio,
|
|
'twisted': extras_require_twisted,
|
|
'accelerate': extras_require_accelerate,
|
|
'compress': extras_require_compress,
|
|
'serialization': extras_require_serialization,
|
|
'encryption': extras_require_encryption,
|
|
'dev': extras_require_dev,
|
|
},
|
|
tests_require=test_requirements,
|
|
cmdclass={
|
|
'test': PyTest
|
|
},
|
|
packages=[
|
|
'autobahn',
|
|
'autobahn.test',
|
|
'autobahn.wamp',
|
|
'autobahn.wamp.test',
|
|
'autobahn.websocket',
|
|
'autobahn.websocket.test',
|
|
'autobahn.rawsocket',
|
|
'autobahn.rawsocket.test',
|
|
'autobahn.asyncio',
|
|
'autobahn.twisted',
|
|
'twisted.plugins'
|
|
],
|
|
package_data={'autobahn.asyncio': ['test/*']},
|
|
zip_safe=False,
|
|
# http://pypi.python.org/pypi?%3Aaction=list_classifiers
|
|
classifiers=["License :: OSI Approved :: MIT License",
|
|
"Development Status :: 5 - Production/Stable",
|
|
"Environment :: No Input/Output (Daemon)",
|
|
"Framework :: Twisted",
|
|
"Intended Audience :: Developers",
|
|
"Operating System :: OS Independent",
|
|
"Programming Language :: Python",
|
|
"Programming Language :: Python :: 2",
|
|
"Programming Language :: Python :: 2.7",
|
|
"Programming Language :: Python :: 3",
|
|
"Programming Language :: Python :: 3.3",
|
|
"Programming Language :: Python :: 3.4",
|
|
"Programming Language :: Python :: 3.5",
|
|
"Programming Language :: Python :: Implementation :: CPython",
|
|
"Programming Language :: Python :: Implementation :: PyPy",
|
|
"Programming Language :: Python :: Implementation :: Jython",
|
|
"Topic :: Internet",
|
|
"Topic :: Internet :: WWW/HTTP",
|
|
"Topic :: Communications",
|
|
"Topic :: System :: Distributed Computing",
|
|
"Topic :: Software Development :: Libraries",
|
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
"Topic :: Software Development :: Object Brokering"],
|
|
keywords='autobahn crossbar websocket realtime rfc6455 wamp rpc pubsub twisted asyncio'
|
|
)
|
|
|
|
|
|
# regenerate Twisted plugin cache
|
|
try:
|
|
from twisted.internet import reactor
|
|
print("Twisted found (default reactor is {0})".format(reactor.__class__))
|
|
except ImportError:
|
|
# the user doesn't have Twisted, so skip
|
|
pass
|
|
else:
|
|
# Make Twisted regenerate the dropin.cache, if possible. This is necessary
|
|
# because in a site-wide install, dropin.cache cannot be rewritten by
|
|
# normal users.
|
|
if _HAD_SIX:
|
|
# only proceed if we had had six already _before_ installing AutobahnPython,
|
|
# since it produces errs/warns otherwise
|
|
try:
|
|
from twisted.plugin import IPlugin, getPlugins
|
|
list(getPlugins(IPlugin))
|
|
except Exception as e:
|
|
print("Failed to update Twisted plugin cache: {0}".format(e))
|
|
else:
|
|
print("Twisted dropin.cache regenerated.")
|
|
else:
|
|
print("Warning: regenerate of Twisted dropin.cache skipped (can't run when six wasn't there before)")
|