############################################################################### # # The MIT License (MIT) # # Copyright (c) Tavendo 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 re import sys import platform from setuptools import setup from setuptools.command.test import test as TestCommand # 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) LONGSDESC = """ .. |ab| replace:: **Autobahn**\|Python |ab| is a networking library that is part of the `Autobahn `__ project and provides implementations of * `The WebSocket Protocol `__ * `The Web Application Messaging Protocol (WAMP) `__ for `Twisted `__ and `asyncio `__, on Python 2 & 3 and for writing servers and clients. WebSocket allows bidirectional real-time messaging on the Web and WAMP adds asynchronous *Remote Procedure Calls* and *Publish & Subscribe* on top of WebSocket. More information: * `Project Site `__ * `Source Code `__ """ # get version string from "autobahn/__init__.py" # See: http://stackoverflow.com/a/7071358/884770 # VERSIONFILE = "autobahn/__init__.py" verstrline = open(VERSIONFILE, "rt").read() VSRE = r"^__version__ = ['\"]([^'\"]*)['\"]" mo = re.search(VSRE, verstrline, re.M) if mo: verstr = mo.group(1) else: raise RuntimeError("Unable to find version string in %s." % (VERSIONFILE,)) # Autobahn core packages # packages = [ 'autobahn', 'autobahn.wamp', 'autobahn.wamp.test', 'autobahn.websocket', 'autobahn.websocket.test', 'autobahn.asyncio', 'autobahn.twisted', 'twisted.plugins' ] if PY3: if PY33: # "Tulip" asyncio_packages = ["asyncio>=0.2.1"] else: # Python 3.4+ has asyncio builtin asyncio_packages = [] else: # backport of asyncio asyncio_packages = ["trollius>=0.1.2", "futures>=2.1.5"] # for testing by users with "python setup.py test" (not Tox, which we use) test_requirements = ["pytest", "mock"] # pytest integration for setuptools. see: # http://pytest.org/latest/goodpractises.html#integration-with-setuptools-test-commands # https://github.com/pyca/cryptography/pull/678/files class PyTest(TestCommand): def finalize_options(self): TestCommand.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) # Now install Autobahn .. # setup( name='autobahn', version=verstr, description='WebSocket client & server library, WAMP real-time framework', long_description=LONGSDESC, license='MIT License', author='Tavendo GmbH', author_email='autobahnws@googlegroups.com', url='http://autobahn.ws/python', platforms='Any', install_requires=['six>=1.6.1'], extras_require={ # asyncio is needed for Autobahn/asyncio 'asyncio': asyncio_packages, # you need Twisted for Autobahn/Twisted - obviously 'twisted': ["zope.interface>=3.6", "Twisted>=11.1"], # native WebSocket and JSON acceleration: this should ONLY be used on CPython 'accelerate': ["wsaccel>=0.6.2", "ujson>=1.33"] if CPY else [], # for (non-standard) WebSocket compression methods - not needed if you # only want standard WebSocket compression ("permessage-deflate") 'compress': ["python-snappy>=0.5", "lz4>=0.2.1"], # needed if you want WAMPv2 binary serialization support 'serialization': ["msgpack-python>=0.4.0"], 'dev': ["pep8", "flake8", "mock>=1.0.1", "pytest>=2.6.4"], }, tests_require=test_requirements, cmdclass={'test': PyTest}, packages=packages, 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.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4", "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 autobahn.ws websocket realtime rfc6455 wamp rpc pubsub twisted asyncio' ) 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)")