From af32d3b773a318c418b2bcab4bdb06c4ee6dfe57 Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Fri, 9 Dec 2016 16:19:46 +0000 Subject: [PATCH 1/2] Don't try to run tox from setup.py Using tox to run the tests is a bad idea, as per the comments. --- setup.py | 62 +++++++++++++++++++++++++------------------------------- 1 file changed, 28 insertions(+), 34 deletions(-) diff --git a/setup.py b/setup.py index c0716a159..7e276f167 100755 --- a/setup.py +++ b/setup.py @@ -16,10 +16,37 @@ import glob import os -from setuptools import setup, find_packages, Command +from setuptools import setup, find_packages import sys +# Some notes on `setup.py test`: +# +# Once upon a time we used to try to make `setup.py test` run `tox` to run the +# tests. That's a bad idea for three reasons: +# +# 1: `setup.py test` is supposed to find out whether the tests work in the +# *current* environmentt, not whatever tox sets up. +# 2: Empirically, trying to install tox during the test run wasn't working ("No +# module named virtualenv"). +# 3: The tox documentation advises against it[1]. +# +# Even further back in time, we used to use setuptools_trial [2]. That has its +# own set of issues: for instance, it requires installation of Twisted to build +# an sdist (because the recommended mode of usage is to add it to +# `setup_requires`). That in turn means that in order to successfully run tox +# you have to have the python header files installed for whichever version of +# python tox uses (which is python3 on recent ubuntus, for example). +# +# So, for now at least, we stick with what appears to be the convention among +# Twisted projects, and don't attempt to do anything when someone runs +# `setup.py test`; instead we direct people to run `trial` directly if they +# care. +# +# [1]: http://tox.readthedocs.io/en/2.5.0/example/basic.html#integration-with-setup-py-test-command +# [2]: https://pypi.python.org/pypi/setuptools_trial + + here = os.path.abspath(os.path.dirname(__file__)) @@ -39,38 +66,6 @@ def exec_file(path_segments): return result -class Tox(Command): - user_options = [('tox-args=', 'a', "Arguments to pass to tox")] - - def initialize_options(self): - self.tox_args = None - - def finalize_options(self): - self.test_args = [] - self.test_suite = True - - def run(self): - #import here, cause outside the eggs aren't loaded - try: - import tox - except ImportError: - try: - self.distribution.fetch_build_eggs("tox") - import tox - except: - raise RuntimeError( - "The tests need 'tox' to run. Please install 'tox'." - ) - import shlex - args = self.tox_args - if args: - args = shlex.split(self.tox_args) - else: - args = [] - errno = tox.cmdline(args=args) - sys.exit(errno) - - version = exec_file(("synapse", "__init__.py"))["__version__"] dependencies = exec_file(("synapse", "python_dependencies.py")) long_description = read_file(("README.rst",)) @@ -86,5 +81,4 @@ setup( zip_safe=False, long_description=long_description, scripts=["synctl"] + glob.glob("scripts/*"), - cmdclass={'test': Tox}, ) From e721a7f2c19fd8804cbfca61b489d3180bd6df74 Mon Sep 17 00:00:00 2001 From: Richard van der Hoff Date: Fri, 9 Dec 2016 18:00:58 +0000 Subject: [PATCH 2/2] Implement a null 'test' command --- setup.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index 7e276f167..b00c2af36 100755 --- a/setup.py +++ b/setup.py @@ -16,10 +16,13 @@ import glob import os -from setuptools import setup, find_packages +from setuptools import setup, find_packages, Command import sys +here = os.path.abspath(os.path.dirname(__file__)) + + # Some notes on `setup.py test`: # # Once upon a time we used to try to make `setup.py test` run `tox` to run the @@ -45,10 +48,19 @@ import sys # # [1]: http://tox.readthedocs.io/en/2.5.0/example/basic.html#integration-with-setup-py-test-command # [2]: https://pypi.python.org/pypi/setuptools_trial +class TestCommand(Command): + user_options = [] + def initialize_options(self): + pass -here = os.path.abspath(os.path.dirname(__file__)) + def finalize_options(self): + pass + def run(self): + print ("""Synapse's tests cannot be run via setup.py. To run them, try: + PYTHONPATH="." trial tests +""") def read_file(path_segments): """Read a file from the package. Takes a list of strings to join to @@ -81,4 +93,5 @@ setup( zip_safe=False, long_description=long_description, scripts=["synctl"] + glob.glob("scripts/*"), + cmdclass={'test': TestCommand}, )