Files
2020-04-08 10:39:44 -07:00

762 lines
30 KiB
INI

# the tox file specifies a way of running our test suite
# against different combinations of libraries and python
# versions.
[tox]
# Our various test environments. The py*-all tasks will run the core
# library tests and all contrib tests with the latest library versions.
# The others will test specific versions of libraries.
#
# FIXME[gabin]:
# If the env name is longer than 128 characters (linux kernel limit specified
# in "master/include/linux/binfmts.h"), we'll get a "bad interpreter: No such file or directory" error.
#
#See linux kernel limitation:
# - https://github.com/torvalds/linux/blob/master/include/linux/binfmts.h#L12
#
#See related github topic:
# - https://github.com/pypa/virtualenv/issues/596
envlist =
flake8
black
wait
{py34,py35,py36,py37}-tracer
{py34,py35,py36,py37}-internal
{py34,py35,py36,py37}-integration
{py34,py35,py36,py37}-ddtracerun
{py34,py35,py36,py37}-test_utils
{py34,py35,py36,py37}-test_logging
# Integrations environments
aiobotocore_contrib-py34-aiobotocore{02,03,04}
aiobotocore_contrib-{py35,py36}-aiobotocore{02,03,04,05,07,08,09,010}
# aiobotocore 0.2 and 0.4 do not work because they use async as a reserved keyword
aiobotocore_contrib-py37-aiobotocore{03,05,07,08,09,010}
# Python 3.7 needs at least aiohttp 2.3
aiohttp_contrib-{py34,py35,py36}-aiohttp{12,13,20,21,22}-aiohttp_jinja{012,013}-yarl
aiohttp_contrib-{py34,py35,py36,py37}-aiohttp23-aiohttp_jinja{015}-yarl10
aiohttp_contrib-{py35,py36,py37}-aiohttp{30,31,32,33,34,35}-aiohttp_jinja{015}-yarl10
aiopg_contrib-{py34,py35,py36}-aiopg{012,015}
aiopg_contrib-py37-aiopg015
algoliasearch_contrib-{py34,py35,py36,py37}-algoliasearch{1,2}
asyncio_contrib-{py34,py35,py36,py37}
# boto needs moto<1 and moto<1 does not support Python >= 3.7
boto_contrib-{py34,py35,py36}-boto
botocore_contrib-{py34,py35,py36,py37}-botocore
bottle_contrib{,_autopatch}-{py34,py35,py36,py37}-bottle{11,12}-webtest
cassandra_contrib-{py34,py35,py36,py37}-cassandra{35,36,37,38,315}
# Non-4.x celery should be able to use the older redis lib, since it locks to an older kombu
celery_contrib-{py34,py35,py36}-celery{31}-redis{210}
# 4.x celery bumps kombu to 4.4+, which requires redis 3.2 or later, this tests against
# older redis with an older kombu, and newer kombu/newer redis.
# https://github.com/celery/kombu/blob/3e60e6503a77b9b1a987cf7954659929abac9bac/Changelog#L35
celery_contrib-{py34,py35,py36}-celery{40,41}-{redis210-kombu43,redis320-kombu44}
# Celery 4.2 is now limited to Kombu 4.3
# https://github.com/celery/celery/commit/1571d414461f01ae55be63a03e2adaa94dbcb15d
celery_contrib-{py34,py35,py36}-celery42-redis210-kombu43
# Celery 4.3 wants Kombu >= 4.4 and Redis >= 3.2
# Python 3.7 needs Celery 4.3
celery_contrib-{py34,py35,py36,py37}-celery43-redis320-kombu44
consul_contrib-py{34,35,36,37}-consul{07,10,11}
dbapi_contrib-{py34,py35,py36}
django_contrib{,_autopatch}-{py34,py35,py36}-django{18,111}-djangopylibmc06-djangoredis45-pylibmc-redis{210}-memcached
django_contrib{,_autopatch}-{py34,py35,py36}-django{200}-djangopylibmc06-djangoredis45-pylibmc-redis{210}-memcached
django_drf_contrib-{py34,py35,py36}-django{111}-djangorestframework{34,37,38}
django_drf_contrib-{py34,py35,py36}-django{200}-djangorestframework{37,38}
dogpile_contrib-{py35,py36,py37}-dogpilecache{06,07,08,latest}
elasticsearch_contrib-{py34,py35,py36}-elasticsearch{16,17,18,23,24,51,52,53,54,63,64}
elasticsearch_contrib-{py34,py35,py36}-elasticsearch1{100}
elasticsearch_contrib-{py34,py35,py36}-elasticsearch2{50}
elasticsearch_contrib-{py34,py35,py36}-elasticsearch5{50}
elasticsearch_contrib-{py34,py35,py36}-elasticsearch6{40}
falcon_contrib{,_autopatch}-{py34,py35,py36}-falcon{10,11,12,13,14}
flask_contrib{,_autopatch}-{py34,py35,py36}-flask{010,011,012,10}-blinker
flask_cache_contrib{,_autopatch}-{py34,py35,py36,py37}-flask{010,011,012}-flaskcache{013}-memcached-redis{210}-blinker
futures_contrib-{py34,py35,py36,py37}
gevent_contrib-{py34,py35,py36}-gevent{11,12,13}
gevent_contrib-py37-gevent{13,14}
grpc_contrib-{py34,py35,py36,py37}-grpc{112,113,114,115,116,117,118,119,120,121,122}
httplib_contrib-{py34,py35,py36,py37}
jinja2_contrib-{py34,py35,py36,py37}-jinja{27,28,29,210}
mako_contrib-{py34,py35,py36,py37}-mako{010,100}
molten_contrib-py{36,37}-molten{070,072}
mongoengine_contrib-{py34,py35,py36,py37}-mongoengine{015,016,017,018,latest}-pymongo{latest}
mysql_contrib-{py34,py35,py36,py37}-mysqlconnector
mysqldb_contrib-{py27}-mysqldb{12}
mysqldb_contrib-{py34,py35,py36,py37}-mysqlclient{13}
psycopg_contrib-{py34,py35,py36}-psycopg2{24,25,26,27,28}
psycopg_contrib-py37-psycopg2{27,28}
pylibmc_contrib-{py34,py35,py36,py37}-pylibmc{140,150}
pymemcache_contrib{,_autopatch}-{py34,py35,py36,py37}-pymemcache{130,140}
pymongo_contrib-{py34,py35,py36,py37}-pymongo{30,31,32,33,34,35,36,37,38,39,latest}-mongoengine{latest}
pymysql_contrib-{py34,py35,py36,py37}-pymysql{07,08,09}
pyramid_contrib{,_autopatch}-{py34,py35,py36,py37}-pyramid{17,18,19}-webtest
redis_contrib-{py34,py35,py36,py37}-redis{26,27,28,29,210,300}
rediscluster_contrib-{py34,py35,py36,py37}-rediscluster{135,136}-redis210
requests_contrib{,_autopatch}-{py34,py35,py36,py37}-requests{208,209,210,211,212,213,219}
kombu_contrib-{py34,py35,py36}-kombu{40,41,42}
# Python 3.7 needs Kombu >= 4.2
kombu_contrib-py37-kombu42
# python 3.6 requests + gevent regression test
# DEV: This is a known issue for gevent 1.1, suggestion is to upgrade to gevent > 1.2
# https://github.com/gevent/gevent/issues/903
requests_gevent_contrib-{py36}-requests{208,209,210,211,212,213,219}-gevent{12,13}
requests_gevent_contrib-py37-requests{208,209,210,211,212,213,219}-gevent13
sqlalchemy_contrib-{py34,py35,py36,py37}-sqlalchemy{10,11,12}-psycopg228-mysqlconnector
sqlite3_contrib-{py34,py35,py36,py37}-sqlite3
tornado_contrib-{py34,py35,py36,py37}-tornado{40,41,42,43,44,45}
tornado_contrib-{py37}-tornado{50,51,60}
vertica_contrib-{py34,py35,py36,py37}-vertica{060,070}
# Opentracer
{py34,py35,py36,py37}-opentracer
{py34,py35,py36,py37}-opentracer_asyncio
{py34,py35,py36,py37}-opentracer_tornado-tornado{40,41,42,43,44}
{py34,py35,py36}-opentracer_gevent-gevent{11,12}
py37-opentracer_gevent-gevent{13,14}
# Unit tests: pytest based test suite that do not require any additional dependency
unit_tests-{py34,py35,py36,py37}
benchmarks-{py34,py35,py36,py37}
[testenv]
# Always re-run `setup.py develop` to ensure the proper C-extension .so files are created
# DEV: If we don't do this sometimes CircleCI gets messed up and only has the py27 .so
# meaning running on py3.x will fail
# https://stackoverflow.com/questions/57459123/why-do-i-need-to-run-tox-twice-to-test-a-python-package-with-c-extension
commands_pre={envpython} {toxinidir}/setup.py develop
usedevelop = True
basepython =
py34: python3.4
py35: python3.5
py36: python3.6
py37: python3.7
deps =
pdbpp
pytest>=3
pytest-benchmark
pytest-cov
pytest-django
pytest-mock
opentracing
# test dependencies installed in all envs
mock
# force the downgrade as a workaround
# https://github.com/aio-libs/aiohttp/issues/2662
yarl: yarl==0.18.0
yarl10: yarl>=1.0,<1.1
# integrations
aiobotocore010: aiobotocore>=0.10,<0.11
aiobotocore09: aiobotocore>=0.9,<0.10
aiobotocore08: aiobotocore>=0.8,<0.9
aiobotocore07: aiobotocore>=0.7,<0.8
# aiobotocore06 does not work
aiobotocore05: aiobotocore>=0.5,<0.6
aiobotocore04: aiobotocore>=0.4,<0.5
aiobotocore03: aiobotocore>=0.3,<0.4
aiobotocore02: aiobotocore>=0.2,<0.3
aiobotocore02: multidict==4.5.2
aiobotocore{02,03,04}-{py34}: typing
aiopg012: aiopg>=0.12,<0.13
aiopg015: aiopg>=0.15,<0.16
aiopg: sqlalchemy
aiohttp12: aiohttp>=1.2,<1.3
aiohttp13: aiohttp>=1.3,<1.4
aiohttp20: aiohttp>=2.0,<2.1
aiohttp21: aiohttp>=2.1,<2.2
aiohttp22: aiohttp>=2.2,<2.3
aiohttp23: aiohttp>=2.3,<2.4
aiohttp30: aiohttp>=3.0,<3.1
aiohttp31: aiohttp>=3.1,<3.2
aiohttp32: aiohttp>=3.2,<3.3
aiohttp33: aiohttp>=3.3,<3.4
aiohttp34: aiohttp>=3.4,<3.5
aiohttp35: aiohttp>=3.5,<3.6
aiohttp_jinja012: aiohttp_jinja2>=0.12,<0.13
aiohttp_jinja013: aiohttp_jinja2>=0.13,<0.14
aiohttp_jinja015: aiohttp_jinja2>=0.15,<0.16
algoliasearch1: algoliasearch>=1.2,<2
algoliasearch2: algoliasearch>=2,<3
blinker: blinker
boto: boto
boto: moto<1.0
botocore: botocore
py34-botocore: PyYAML<5.3
py34-botocore: jsonpatch<1.25
botocore: moto>=1.0,<2
bottle11: bottle>=0.11,<0.12
bottle12: bottle>=0.12,<0.13
cassandra35: cassandra-driver>=3.5,<3.6
cassandra36: cassandra-driver>=3.6,<3.7
cassandra37: cassandra-driver>=3.7,<3.8
cassandra38: cassandra-driver>=3.8,<3.9
cassandra315: cassandra-driver>=3.15,<3.16
celery31: celery>=3.1,<3.2
celery40: celery>=4.0,<4.1
celery41: celery>=4.1,<4.2
celery42: celery>=4.2,<4.3
celery43: celery>=4.3,<4.4
consul07: python-consul>=0.7,<1.0
consul10: python-consul>=1.0,<1.1
consul11: python-consul>=1.1,<1.2
ddtracerun: redis
django18: django>=1.8,<1.9
django111: django>=1.11,<1.12
django200: django>=2.0,<2.1
djangopylibmc06: django-pylibmc>=0.6,<0.7
djangoredis45: django-redis>=4.5,<4.6
djangorestframework34: djangorestframework>=3.4,<3.5
djangorestframework37: djangorestframework>=3.7,<3.8
djangorestframework38: djangorestframework>=3.8,<3.9
dogpilecache06: dogpile.cache==0.6.*
dogpilecache07: dogpile.cache==0.7.*
dogpilecache08: dogpile.cache==0.8.*
dogpilecachelatest: dogpile.cache
elasticsearch16: elasticsearch>=1.6,<1.7
elasticsearch17: elasticsearch>=1.7,<1.8
elasticsearch18: elasticsearch>=1.8,<1.9
elasticsearch23: elasticsearch>=2.3,<2.4
elasticsearch24: elasticsearch>=2.4,<2.5
elasticsearch51: elasticsearch>=5.1,<5.2
elasticsearch52: elasticsearch>=5.2,<5.3
elasticsearch53: elasticsearch>=5.3,<5.4
elasticsearch54: elasticsearch>=5.4,<5.5
elasticsearch63: elasticsearch>=6.3,<6.4
elasticsearch64: elasticsearch>=6.4,<6.5
# elasticsearch1 package
elasticsearch1100: elasticsearch1>=1.10.0,<1.11.0
# elasticsearch2 package
elasticsearch250: elasticsearch2>=2.5.0,<2.6.0
# elasticsearch5 package
elasticsearch550: elasticsearch5>=5.5.0,<5.6.0
# elasticsearch6 package
elasticsearch640: elasticsearch6>=6.4.0,<6.5.0
falcon10: falcon>=1.0,<1.1
falcon11: falcon>=1.1,<1.2
falcon12: falcon>=1.2,<1.3
falcon13: falcon>=1.3,<1.4
falcon14: falcon>=1.4,<1.5
flask010: flask>=0.10,<0.11
flask011: flask>=0.11,<0.12
flask012: flask>=0.12,<0.13
flask10: flask>=1.0,<1.1
flaskcache012: flask_cache>=0.12,<0.13
flaskcache013: flask_cache>=0.13,<0.14
futures: futures
futures30: futures>=3.0,<3.1
futures31: futures>=3.1,<3.2
futures32: futures>=3.2,<3.3
gevent11: gevent>=1.1,<1.2
gevent12: gevent>=1.2,<1.3
gevent13: gevent>=1.3,<1.4
gevent14: gevent>=1.4,<1.5
grpc112: grpcio>=1.12.0,<1.13.0
grpc113: grpcio>=1.13.0,<1.14.0
grpc114: grpcio>=1.14.0,<1.15.0
grpc115: grpcio>=1.15.0,<1.16.0
grpc116: grpcio>=1.16.0,<1.17.0
grpc117: grpcio>=1.17.0,<1.18.0
grpc118: grpcio>=1.18.0,<1.19.0
grpc119: grpcio>=1.19.0,<1.20.0
grpc120: grpcio>=1.20.0,<1.21.0
grpc121: grpcio>=1.21.0,<1.22.0
grpc122: grpcio>=1.22.0,<1.23.0
grpc112: googleapis-common-protos
grpc113: googleapis-common-protos
grpc114: googleapis-common-protos
grpc115: googleapis-common-protos
grpc116: googleapis-common-protos
grpc117: googleapis-common-protos
grpc118: googleapis-common-protos
grpc119: googleapis-common-protos
grpc120: googleapis-common-protos
grpc121: googleapis-common-protos
grpc122: googleapis-common-protos
jinja27: jinja2>=2.7,<2.8
jinja28: jinja2>=2.8,<2.9
jinja29: jinja2>=2.9,<2.10
jinja210: jinja2>=2.10,<2.11
mako100: mako>=1.0.0,<1.1.0
mako010: mako>=0.1.0,<1.0.0
memcached: python-memcached
molten070: molten>=0.7.0,<0.7.2
molten072: molten>=0.7.2,<0.8.0
mongoengine015: mongoengine>=0.15<0.16
mongoengine016: mongoengine>=0.16<0.17
mongoengine017: mongoengine>=0.17<0.18
mongoengine018: mongoengine>=0.18<0.19
mongoenginelatest: mongoengine>=0.18
mysqlconnector: mysql-connector-python!=8.0.18
mysqldb12: mysql-python>=1.2,<1.3
mysqlclient13: mysqlclient>=1.3,<1.4
pylibmc: pylibmc
pylibmc140: pylibmc>=1.4.0,<1.5.0
pylibmc150: pylibmc>=1.5.0,<1.6.0
pymemcache130: pymemcache>=1.3.0,<1.4.0
pymemcache140: pymemcache>=1.4.0,<1.5.0
pymongo30: pymongo>=3.0,<3.1
pymongo31: pymongo>=3.1,<3.2
pymongo32: pymongo>=3.2,<3.3
pymongo33: pymongo>=3.3,<3.4
pymongo34: pymongo>=3.4,<3.5
pymongo36: pymongo>=3.6,<3.7
pymongo37: pymongo>=3.7,<3.8
pymongo38: pymongo>=3.8,<3.9
pymongo39: pymongo>=3.9,<3.10
pymongolatest: pymongo>=3.9
pymysql07: pymysql>=0.7,<0.8
pymysql08: pymysql>=0.8,<0.9
pymysql09: pymysql>=0.9,<0.10
pyramid17: pyramid>=1.7,<1.8
pyramid18: pyramid>=1.8,<1.9
pyramid19: pyramid>=1.9,<1.10
psycopg224: psycopg2>=2.4,<2.5
psycopg225: psycopg2>=2.5,<2.6
psycopg226: psycopg2>=2.6,<2.7
psycopg227: psycopg2>=2.7,<2.8
psycopg228: psycopg2>=2.8,<2.9
redis26: redis>=2.6,<2.7
redis27: redis>=2.7,<2.8
redis28: redis>=2.8,<2.9
redis29: redis>=2.9,<2.10
redis210: redis>=2.10,<2.11
redis300: redis>=3.0.0,<3.1.0
redis320: redis>=3.2.0,<3.3.0
rediscluster135: redis-py-cluster>=1.3.5,<1.3.6
rediscluster136: redis-py-cluster>=1.3.6,<1.3.7
kombu44: kombu>=4.4,<4.5
kombu43: kombu>=4.3,<4.4
kombu42: kombu>=4.2,<4.3
kombu41: kombu>=4.1,<4.2
kombu40: kombu>=4.0,<4.1
requests_contrib: requests-mock>=1.4
requests200: requests>=2.0,<2.1
requests208: requests>=2.8,<2.9
requests209: requests>=2.9,<2.10
requests210: requests>=2.10,<2.11
requests211: requests>=2.11,<2.12
requests212: requests>=2.12,<2.13
requests213: requests>=2.13,<2.14
requests218: requests>=2.18,<2.19
requests219: requests>=2.19,<2.20
sqlalchemy10: sqlalchemy>=1.0,<1.1
sqlalchemy11: sqlalchemy>=1.1,<1.2
sqlalchemy12: sqlalchemy>=1.2,<1.3
tornado40: tornado>=4.0,<4.1
tornado41: tornado>=4.1,<4.2
tornado42: tornado>=4.2,<4.3
tornado43: tornado>=4.3,<4.4
tornado44: tornado>=4.4,<4.5
tornado45: tornado>=4.5,<4.6
tornado50: tornado>=5.0,<5.1
tornado51: tornado>=5.1,<5.2
tornado60: tornado>=6.0,<6.1
vertica060: vertica-python>=0.6.0,<0.7.0
vertica070: vertica-python>=0.7.0,<0.8.0
webtest: WebTest
# pass along test env variables
passenv=TEST_*
commands =
# run only essential tests related to the tracing client
tracer: pytest {posargs} --ignore="tests/contrib" --ignore="tests/test_integration.py" --ignore="tests/commands" --ignore="tests/opentracer" --ignore="tests/unit" --ignore="tests/internal" tests
# run only the `ddtrace.internal` tests
internal: pytest {posargs} tests/internal
# run only the opentrace tests
opentracer: pytest {posargs} tests/opentracer/test_tracer.py tests/opentracer/test_span.py tests/opentracer/test_span_context.py tests/opentracer/test_dd_compatibility.py tests/opentracer/test_utils.py
opentracer_asyncio: pytest {posargs} tests/opentracer/test_tracer_asyncio.py
opentracer_tornado-tornado{40,41,42,43,44}: pytest {posargs} tests/opentracer/test_tracer_tornado.py
opentracer_gevent: pytest {posargs} tests/opentracer/test_tracer_gevent.py
# integration tests
integration: pytest {posargs} tests/test_integration.py
# Contribs
aiobotocore_contrib-{py34,py35,py36,py37}: pytest {posargs} tests/contrib/aiobotocore
aiopg_contrib-{py34,py35,py36,py37}: pytest {posargs} tests/contrib/aiopg
aiohttp_contrib: pytest {posargs} tests/contrib/aiohttp
algoliasearch_contrib: pytest {posargs} tests/contrib/algoliasearch
asyncio_contrib: pytest {posargs} tests/contrib/asyncio
boto_contrib: pytest {posargs} tests/contrib/boto
botocore_contrib: pytest {posargs} tests/contrib/botocore
bottle_contrib: pytest {posargs} --ignore="tests/contrib/bottle/test_autopatch.py" tests/contrib/bottle/
bottle_contrib_autopatch: python tests/ddtrace_run.py pytest {posargs} tests/contrib/bottle/test_autopatch.py
cassandra_contrib: pytest {posargs} tests/contrib/cassandra
celery_contrib: pytest {posargs} tests/contrib/celery
consul_contrib: pytest {posargs} tests/contrib/consul
dbapi_contrib: pytest {posargs} tests/contrib/dbapi
django_contrib: pytest {posargs} tests/contrib/django
django_contrib_autopatch: python tests/ddtrace_run.py pytest {posargs} tests/contrib/django
django_drf_contrib: pytest {posargs} tests/contrib/djangorestframework
dogpile_contrib: pytest {posargs} tests/contrib/dogpile_cache
elasticsearch_contrib: pytest {posargs} tests/contrib/elasticsearch
falcon_contrib: pytest {posargs} tests/contrib/falcon/test_middleware.py tests/contrib/falcon/test_distributed_tracing.py
falcon_contrib_autopatch: python tests/ddtrace_run.py pytest {posargs} tests/contrib/falcon/test_autopatch.py
flask_contrib: pytest {posargs} tests/contrib/flask
flask_contrib_autopatch: python tests/ddtrace_run.py pytest {posargs} tests/contrib/flask_autopatch
flask_cache_contrib: pytest {posargs} tests/contrib/flask_cache
futures_contrib: pytest {posargs} tests/contrib/futures
gevent_contrib: pytest {posargs} tests/contrib/gevent
grpc_contrib: pytest {posargs} tests/contrib/grpc
httplib_contrib: pytest {posargs} tests/contrib/httplib
jinja2_contrib: pytest {posargs} tests/contrib/jinja2
mako_contrib: pytest {posargs} tests/contrib/mako
molten_contrib: pytest {posargs} tests/contrib/molten
mongoengine_contrib: pytest {posargs} tests/contrib/mongoengine
mysql_contrib: pytest {posargs} tests/contrib/mysql
mysqldb_contrib: pytest {posargs} tests/contrib/mysqldb
psycopg_contrib: pytest {posargs} tests/contrib/psycopg
pylibmc_contrib: pytest {posargs} tests/contrib/pylibmc
pymemcache_contrib: pytest {posargs} --ignore="tests/contrib/pymemcache/autopatch" tests/contrib/pymemcache/
pymemcache_contrib_autopatch: python tests/ddtrace_run.py pytest {posargs} tests/contrib/pymemcache/autopatch/
pymongo_contrib: pytest {posargs} tests/contrib/pymongo
pymysql_contrib: pytest {posargs} tests/contrib/pymysql
pyramid_contrib: pytest {posargs} tests/contrib/pyramid/test_pyramid.py
pyramid_contrib_autopatch: python tests/ddtrace_run.py pytest {posargs} tests/contrib/pyramid/test_pyramid_autopatch.py
redis_contrib: pytest {posargs} tests/contrib/redis
rediscluster_contrib: pytest {posargs} tests/contrib/rediscluster
requests_contrib: pytest {posargs} tests/contrib/requests
requests_gevent_contrib: pytest {posargs} tests/contrib/requests_gevent
kombu_contrib: pytest {posargs} tests/contrib/kombu
sqlalchemy_contrib: pytest {posargs} tests/contrib/sqlalchemy
sqlite3_contrib: pytest {posargs} tests/contrib/sqlite3
tornado_contrib: pytest {posargs} tests/contrib/tornado
vertica_contrib: pytest {posargs} tests/contrib/vertica/
# run subsets of the tests for particular library versions
ddtracerun: pytest {posargs} tests/commands/test_runner.py
test_utils: pytest {posargs} tests/contrib/test_utils.py
test_logging: pytest {posargs} tests/contrib/logging/
# Unit tests: pytest based test suite that do not require any additional dependency.
unit_tests: pytest {posargs} tests/unit
benchmarks: pytest --benchmark-only {posargs} tests/benchmark.py
[testenv:wait]
commands=python tests/wait-for-services.py {posargs}
basepython=python
deps=
cassandra-driver
psycopg2
mysql-connector-python!=8.0.18
redis-py-cluster>=1.3.6,<1.4.0
vertica-python>=0.6.0,<0.7.0
kombu>=4.2.0,<4.3.0
# this is somewhat flaky (can fail and still be up) so try the tests anyway
ignore_outcome=true
[testenv:black]
deps=black
commands=black --check .
basepython=python3.7
[testenv:flake8]
deps=
flake8>=3.7,<=3.8
flake8-blind-except
flake8-builtins
flake8-docstrings
flake8-logging-format
flake8-rst-docstrings
# needed for some features from flake8-rst-docstrings
pygments
commands=flake8 .
basepython=python3.7
# do not use develop mode with celery as running multiple python versions within
# same job will cause problem for tests that use ddtrace-run
[celery_contrib]
usedevelop = False
[testenv:celery_contrib-py34-celery31-redis210]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py35-celery31-redis210]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py36-celery31-redis210]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py34-celery40-redis210-kombu43]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py34-celery40-redis320-kombu44]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py34-celery41-redis210-kombu43]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py34-celery41-redis320-kombu44]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py35-celery40-redis210-kombu43]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py35-celery40-redis320-kombu44]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py35-celery41-redis210-kombu43]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py35-celery41-redis320-kombu44]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py36-celery40-redis210-kombu43]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py36-celery40-redis320-kombu44]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py36-celery41-redis210-kombu43]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py36-celery41-redis320-kombu44]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py34-celery42-redis210-kombu43]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py35-celery42-redis210-kombu43]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py36-celery42-redis210-kombu43]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py34-celery43-redis320-kombu44]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py35-celery43-redis320-kombu44]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py36-celery43-redis320-kombu44]
usedevelop = {[celery_contrib]usedevelop}
[testenv:celery_contrib-py37-celery43-redis320-kombu44]
usedevelop = {[celery_contrib]usedevelop}
[falcon_autopatch]
setenv =
DATADOG_SERVICE_NAME=my-falcon
[testenv:falcon_contrib_autopatch-py34-falcon10]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py34-falcon11]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py34-falcon12]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py34-falcon13]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py34-falcon14]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py35-falcon10]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py35-falcon11]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py35-falcon12]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py35-falcon13]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py35-falcon14]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py36-falcon10]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py36-falcon11]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py36-falcon12]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py36-falcon13]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py36-falcon14]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py37-falcon10]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py37-falcon11]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py37-falcon12]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py37-falcon13]
setenv =
{[falcon_autopatch]setenv}
[testenv:falcon_contrib_autopatch-py37-falcon14]
setenv =
{[falcon_autopatch]setenv}
[pyramid_autopatch]
setenv =
DATADOG_SERVICE_NAME = foobar
DATADOG_PYRAMID_DISTRIBUTED_TRACING = True
[testenv:pyramid_contrib_autopatch-py34-pyramid17-webtest]
setenv =
{[pyramid_autopatch]setenv}
[testenv:pyramid_contrib_autopatch-py34-pyramid18-webtest]
setenv =
{[pyramid_autopatch]setenv}
[testenv:pyramid_contrib_autopatch-py34-pyramid19-webtest]
setenv =
{[pyramid_autopatch]setenv}
[testenv:pyramid_contrib_autopatch-py35-pyramid17-webtest]
setenv =
{[pyramid_autopatch]setenv}
[testenv:pyramid_contrib_autopatch-py35-pyramid18-webtest]
setenv =
{[pyramid_autopatch]setenv}
[testenv:pyramid_contrib_autopatch-py35-pyramid19-webtest]
setenv =
{[pyramid_autopatch]setenv}
[testenv:pyramid_contrib_autopatch-py36-pyramid17-webtest]
setenv =
{[pyramid_autopatch]setenv}
[testenv:pyramid_contrib_autopatch-py36-pyramid18-webtest]
setenv =
{[pyramid_autopatch]setenv}
[testenv:pyramid_contrib_autopatch-py36-pyramid19-webtest]
setenv =
{[pyramid_autopatch]setenv}
[testenv:pyramid_contrib_autopatch-py37-pyramid17-webtest]
setenv =
{[pyramid_autopatch]setenv}
[testenv:pyramid_contrib_autopatch-py37-pyramid18-webtest]
setenv =
{[pyramid_autopatch]setenv}
[testenv:pyramid_contrib_autopatch-py37-pyramid19-webtest]
setenv =
{[pyramid_autopatch]setenv}
[flask_autopatch]
setenv =
DATADOG_SERVICE_NAME = test.flask.service
DATADOG_PATCH_MODULES = jinja2:false
[testenv:flask_contrib_autopatch-py34-flask010-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py34-flask011-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py34-flask012-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py34-flask10-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py35-flask010-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py35-flask011-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py35-flask012-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py35-flask10-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py36-flask010-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py36-flask011-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py36-flask012-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py36-flask10-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py37-flask010-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py37-flask011-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py37-flask012-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py37-flask10-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py34-flask010-flaskcache013-memcached-redis210-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py34-flask011-flaskcache013-memcached-redis210-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py34-flask012-flaskcache013-memcached-redis210-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py35-flask010-flaskcache013-memcached-redis210-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py35-flask011-flaskcache013-memcached-redis210-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py35-flask012-flaskcache013-memcached-redis210-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py36-flask010-flaskcache013-memcached-redis210-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py36-flask011-flaskcache013-memcached-redis210-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py36-flask012-flaskcache013-memcached-redis210-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py37-flask010-flaskcache013-memcached-redis210-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py37-flask011-flaskcache013-memcached-redis210-blinker]
setenv =
{[flask_autopatch]setenv}
[testenv:flask_contrib_autopatch-py37-flask012-flaskcache013-memcached-redis210-blinker]
setenv =
{[flask_autopatch]setenv}
[bottle_autopatch]
setenv =
DATADOG_SERVICE_NAME = bottle-app
[testenv:bottle_contrib_autopatch-py34-bottle11-webtest]
setenv =
{[bottle_autopatch]setenv}
[testenv:bottle_contrib_autopatch-py35-bottle11-webtest]
setenv =
{[bottle_autopatch]setenv}
[testenv:bottle_contrib_autopatch-py36-bottle11-webtest]
setenv =
{[bottle_autopatch]setenv}
[testenv:bottle_contrib_autopatch-py37-bottle11-webtest]
setenv =
{[bottle_autopatch]setenv}
[testenv:bottle_contrib_autopatch-py34-bottle12-webtest]
setenv =
{[bottle_autopatch]setenv}
[testenv:bottle_contrib_autopatch-py35-bottle12-webtest]
setenv =
{[bottle_autopatch]setenv}
[testenv:bottle_contrib_autopatch-py36-bottle12-webtest]
setenv =
{[bottle_autopatch]setenv}
[testenv:bottle_contrib_autopatch-py37-bottle12-webtest]
setenv =
{[bottle_autopatch]setenv}
# DEV: We use `conftest.py` as a local pytest plugin to configure hooks for collection
[pytest]
# Common directories to ignore
addopts = --ignore "tests/utils" --ignore "tests/base"
# DEV: The default is `test_*\.py` which will miss `test.py` files
python_files = test*\.py
[flake8]
max-line-length=120
exclude=
.ddtox,.tox,
.git,__pycache__,
.eggs,*.egg,
build,
# We shouldn't lint our vendored dependencies
ddtrace/vendor/
# Ignore:
# A003: XXX is a python builtin, consider renaming the class attribute
# G201 Logging: .exception(...) should be used instead of .error(..., exc_info=True)
# E231,W503: not respected by black
# We ignore most of the D errors because there are too many; the goal is to fix them eventually
ignore = W503,E231,A003,G201,D100,D101,D102,D103,D104,D105,D106,D107,D200,D202,D204,D205,D208,D210,D300,D400,D401,D403,D413
enable-extensions=G
rst-roles = class,meth,obj,ref
rst-directives = py:data