# Tox (http://tox.testrun.org/) is a tool for running tests # in multiple virtualenvs. This configuration file will run the # test suite on all supported python versions. To use it, "pip install tox" # and then run "tox" from this directory. # Map Python versions in GitHub Actions to tox environments to run. [gh-actions] python = 2.7: py27-coverage,codechecks 3.6: py36-coverage,integration3 3.7: py37-coverage 3.8: py38-coverage 3.9: py39-coverage,typechecks,codechecks3 pypy-3.7: pypy3 [pytest] twisted = 1 [tox] envlist = typechecks,codechecks,codechecks3,py{27,36,37,38,39}-{coverage},pypy27,pypy3 minversion = 2.4 [testenv] passenv = TAHOE_LAFS_* PIP_* SUBUNITREPORTER_* USERPROFILE HOMEDRIVE HOMEPATH # Get "certifi" to avoid bug #2913. Basically if a `setup_requires=...` causes # a package to be installed (with setuptools) then it'll fail on certain # platforms (travis's OX-X 10.12, Slackware 14.2) because PyPI's TLS # requirements (TLS >= 1.2) are incompatible with the old TLS clients # available to those systems. Installing it ahead of time (with pip) avoids # this problem. deps = # Pin all of these versions for the same reason you ever want to pin # anything: to prevent new releases with regressions from introducing # spurious failures into CI runs for whatever development work is # happening at the time. The versions selected here are just the current # versions at the time. Bumping them to keep up with future releases is # fine as long as those releases are known to actually work. # # For now these are versions that support Python 2. pip==20.3.4 setuptools==44.1.1 wheel==0.36.2 subunitreporter==19.3.2 # As an exception, we don't pin certifi because it contains CA # certificates which necessarily change over time. Pinning this is # guaranteed to cause things to break eventually as old certificates # expire and as new ones are used in the wild that aren't present in # whatever version we pin. Hopefully there won't be functionality # regressions in new releases of this package that cause us the kind of # suffering we're trying to avoid with the above pins. certifi # VCS hooks support py36,!coverage: pre-commit # We add usedevelop=False because testing against a true installation gives # more useful results. usedevelop = False # We use extras=test to get things like "mock" that are required for our unit # tests. extras = test setenv = # Define TEST_SUITE in the environment as an aid to constructing the # correct test command below. TEST_SUITE = allmydata commands = # As an aid to debugging, dump all of the Python packages and their # versions that are installed in the test environment. This is # particularly useful to get from CI runs - though hopefully the # version pinning we do limits the variability of this output pip freeze tahoe --version # Run tests with -b to catch bugs like `"%s" % (some_bytes,)`. -b makes # Python emit BytesWarnings, and warnings configuration in # src/allmydata/tests/__init__.py turns allmydata's BytesWarnings into # exceptions. !coverage: python -b -m twisted.trial {env:TAHOE_LAFS_TRIAL_ARGS:--rterrors} {posargs:{env:TEST_SUITE}} # measuring coverage is somewhat slower than not measuring coverage # so only do it on request. coverage: python -b -m coverage run -m twisted.trial {env:TAHOE_LAFS_TRIAL_ARGS:--rterrors --reporter=timing} {posargs:{env:TEST_SUITE}} coverage: coverage combine coverage: coverage xml coverage: coverage report [testenv:integration] setenv = COVERAGE_PROCESS_START=.coveragerc commands = # NOTE: 'run with "py.test --keep-tempdir -s -v integration/" to debug failures' py.test --timeout=1800 --coverage -v {posargs:integration} coverage combine coverage report [testenv:integration3] basepython = python3 setenv = COVERAGE_PROCESS_START=.coveragerc commands = # NOTE: 'run with "py.test --keep-tempdir -s -v integration/" to debug failures' py.test --timeout=1800 --coverage -v {posargs:integration/test_aaa_aardvark.py integration/test_servers_of_happiness.py integration/test_sftp.py} coverage combine coverage report [testenv:codechecks] basepython = python2.7 # On macOS, git inside of towncrier needs $HOME. passenv = HOME whitelist_externals = /bin/mv setenv = # Workaround an error when towncrier is run under the VCS hook, # https://stackoverflow.com/a/4027726/624787: # File "/home/rpatterson/src/work/sfu/tahoe-lafs/.tox/codechecks/lib/python2.7/site-packages/towncrier/check.py", line 44, in __main # .decode(getattr(sys.stdout, "encoding", "utf8")) # `TypeError: decode() argument 1 must be string, not None` PYTHONIOENCODING=utf_8 # If no positional arguments are given, try to run the checks on the # entire codebase, including various pieces of supporting code. DEFAULT_FILES=src integration static misc setup.py commands = flake8 {posargs:{env:DEFAULT_FILES}} python misc/coding_tools/check-umids.py {posargs:{env:DEFAULT_FILES}} python misc/coding_tools/check-debugging.py {posargs:{env:DEFAULT_FILES}} python misc/coding_tools/find-trailing-spaces.py -r {posargs:{env:DEFAULT_FILES}} python misc/coding_tools/check-miscaptures.py {posargs:{env:DEFAULT_FILES}} # If towncrier.check fails, you forgot to add a towncrier news # fragment explaining the change in this branch. Create one at # `newsfragments/.` with some text for the news # file. See towncrier.pyproject.toml for legal values. python -m towncrier.check --config towncrier.pyproject.toml [testenv:codechecks3] basepython = python3 setenv = # If no positional arguments are given, try to run the checks on the # entire codebase, including various pieces of supporting code. DEFAULT_FILES=src integration static misc setup.py commands = flake8 {posargs:{env:DEFAULT_FILES}} [testenv:typechecks] basepython = python3 skip_install = True deps = mypy git+https://github.com/Shoobx/mypy-zope git+https://github.com/warner/foolscap # Twisted 21.2.0 introduces some type hints which we are not yet # compatible with. # https://tahoe-lafs.org/trac/tahoe-lafs/ticket/3622 twisted<21.2.0 commands = mypy src [testenv:draftnews] passenv = TAHOE_LAFS_* PIP_* SUBUNITREPORTER_* USERPROFILE HOMEDRIVE HOMEPATH # see comment in [testenv] about "certifi" whitelist_externals = mv deps = certifi towncrier >= 19.2 commands = # With pip >= 10 the existence of pyproject.toml (which we are # required to have to configure towncrier) triggers a "build # isolation" mode which prevents anything from working. Avoid # triggering that pip behavior by keeping the towncrier configuration # somewhere else and only bringing it in when it's actually needed # (after pip is done). # # Some discussion is available at # https://github.com/pypa/pip/issues/5696 # # towncrier post 19.2 (unreleased as of this writing) adds a --config # option that can be used instead of this file shuffling. mv towncrier.pyproject.toml pyproject.toml # towncrier 19.2 + works with python2.7 python -m towncrier --draft # put it back mv pyproject.toml towncrier.pyproject.toml [testenv:news] passenv = TAHOE_LAFS_* PIP_* SUBUNITREPORTER_* USERPROFILE HOMEDRIVE HOMEPATH # see comment in [testenv] about "certifi" whitelist_externals = mv deps = certifi towncrier >= 19.2 commands = # With pip >= 10 the existence of pyproject.toml (which we are # required to have to configure towncrier) triggers a "build # isolation" mode which prevents anything from working. Avoid # triggering that pip behavior by keeping the towncrier configuration # somewhere else and only bringing it in when it's actually needed # (after pip is done). # # Some discussion is available at # https://github.com/pypa/pip/issues/5696 # # towncrier post 19.2 (unreleased as of this writing) adds a --config # option that can be used instead of this file shuffling. mv towncrier.pyproject.toml pyproject.toml # towncrier 19.2 + works with python2.7 python -m towncrier --yes # put it back mv pyproject.toml towncrier.pyproject.toml # commit the changes git commit -m "update NEWS.txt for release" [testenv:deprecations] commands = python misc/build_helpers/run-deprecations.py --package allmydata --warnings={env:TAHOE_LAFS_WARNINGS_LOG:_trial_temp/deprecation-warnings.log} trial {env:TAHOE_LAFS_TRIAL_ARGS:--rterrors} {posargs:allmydata} [testenv:upcoming-deprecations] deps = # Take the base deps as well! {[testenv]deps} git+https://github.com/warner/foolscap commands = flogtool --version python misc/build_helpers/run-deprecations.py --package allmydata --warnings={env:TAHOE_LAFS_WARNINGS_LOG:_trial_temp/deprecation-warnings.log} trial {env:TAHOE_LAFS_TRIAL_ARGS:--rterrors} {posargs:allmydata} [testenv:checkmemory] commands = rm -rf _test_memory python src/allmydata/test/check_memory.py upload python src/allmydata/test/check_memory.py upload-self python src/allmydata/test/check_memory.py upload-POST python src/allmydata/test/check_memory.py download python src/allmydata/test/check_memory.py download-GET python src/allmydata/test/check_memory.py download-GET-slow python src/allmydata/test/check_memory.py receive # Use 'tox -e docs' to check formatting and cross-references in docs .rst # files. The published docs are built by code run over at readthedocs.org, # which does not use this target (but does something similar). # # If you have "sphinx" installed in your virtualenv, you can just do "make -C # docs html", or "cd docs; make html". # # You can also open docs/_build/html/index.html to see the rendered docs in # your web browser. [testenv:docs] # we pin docutils because of https://sourceforge.net/p/docutils/bugs/301/ # which asserts when it reads links to .svg files (e.g. about.rst) deps = sphinx docutils==0.12 recommonmark sphinx_rtd_theme # normal install is not needed for docs, and slows things down skip_install = True commands = sphinx-build -W -b html -d {toxinidir}/docs/_build/doctrees {toxinidir}/docs {toxinidir}/docs/_build/html [testenv:pyinstaller] # We override this to pass --no-use-pep517 because pyinstaller (3.4, at least) # is broken when this feature is enabled. install_command = python -m pip install --no-use-pep517 {opts} {packages} extras = deps = {[testenv]deps} packaging # PyInstaller 4.0 drops Python 2 support. When we finish porting to # Python 3 we can reconsider this constraint. pyinstaller < 4.0 # Setting PYTHONHASHSEED to a known value assists with reproducible builds. # See https://pyinstaller.readthedocs.io/en/stable/advanced-topics.html#creating-a-reproducible-build setenv=PYTHONHASHSEED=1 commands= pip freeze pyinstaller -y --clean pyinstaller.spec [testenv:tarballs] deps = commands = python setup.py update_version python setup.py sdist --formats=bztar,gztar,zip bdist_wheel