diff --git a/.gitignore b/.gitignore index 6e9eb1a..986398e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ build/ dist/ tags/ *.egg-info/ +.tox/ +.coverage dr.botzo.data dr.botzo.cfg localsettings.py diff --git a/.prospector.yaml b/.prospector.yaml deleted file mode 100644 index 838b437..0000000 --- a/.prospector.yaml +++ /dev/null @@ -1,20 +0,0 @@ -doc-warnings: true -strictness: high -ignore-paths: - - migrations -ignore-patterns: - - \.log$ - - localsettings.py$ - - parsetab.py$ -pylint: - enable: - - relative-import - options: - max-line-length: 120 - good-names: log -pep8: - options: - max-line-length: 120 -pep257: - disable: - - D203 diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..9b0ec28 --- /dev/null +++ b/tox.ini @@ -0,0 +1,201 @@ +# tox (https://tox.readthedocs.io/) 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. + +[tox] +envlist = begin,py36,py37,py38,coverage,security,lint,bundle + +[testenv] +# build a wheel and test it +wheel = true +wheel_build_env = build + +# whitelist commands we need +whitelist_externals = cp + +# install everything via requirements-dev.txt, so that developer environment +# is the same as the tox environment (for ease of use/no weird gotchas in +# local dev results vs. tox results) and also to avoid ticky-tacky maintenance +# of "oh this particular env has weird results unless I install foo" --- just +# shotgun blast install everything everywhere +deps = + -rrequirements/requirements-dev.txt + +[testenv:build] +# require setuptools when building +deps = setuptools + +[testenv:begin] +# clean up potential previous coverage runs +skip_install = true +commands = coverage erase + +[testenv:py36] +# run pytest with coverage +commands = + pytest --cov-append --cov-branch \ + --cov={envsitepackagesdir}/acro/ \ + --cov={envsitepackagesdir}/countdown/ \ + --cov={envsitepackagesdir}/dice/ \ + --cov={envsitepackagesdir}/dispatch/ \ + --cov={envsitepackagesdir}/dr_botzo/ \ + --cov={envsitepackagesdir}/facts/ \ + --cov={envsitepackagesdir}/gitlab_bot/ \ + --cov={envsitepackagesdir}/ircbot/ \ + --cov={envsitepackagesdir}/karma/ \ + --cov={envsitepackagesdir}/markov/ \ + --cov={envsitepackagesdir}/mpdbot/ \ + --cov={envsitepackagesdir}/pi/ \ + --cov={envsitepackagesdir}/races/ \ + --cov={envsitepackagesdir}/seen/ \ + --cov={envsitepackagesdir}/storycraft/ \ + --cov={envsitepackagesdir}/transform/ \ + --cov={envsitepackagesdir}/twitter/ \ + --cov={envsitepackagesdir}/weather/ + +[testenv:py37] +# run pytest with coverage +commands = + pytest --cov-append --cov-branch \ + --cov={envsitepackagesdir}/acro/ \ + --cov={envsitepackagesdir}/countdown/ \ + --cov={envsitepackagesdir}/dice/ \ + --cov={envsitepackagesdir}/dispatch/ \ + --cov={envsitepackagesdir}/dr_botzo/ \ + --cov={envsitepackagesdir}/facts/ \ + --cov={envsitepackagesdir}/gitlab_bot/ \ + --cov={envsitepackagesdir}/ircbot/ \ + --cov={envsitepackagesdir}/karma/ \ + --cov={envsitepackagesdir}/markov/ \ + --cov={envsitepackagesdir}/mpdbot/ \ + --cov={envsitepackagesdir}/pi/ \ + --cov={envsitepackagesdir}/races/ \ + --cov={envsitepackagesdir}/seen/ \ + --cov={envsitepackagesdir}/storycraft/ \ + --cov={envsitepackagesdir}/transform/ \ + --cov={envsitepackagesdir}/twitter/ \ + --cov={envsitepackagesdir}/weather/ + +[testenv:py38] +# run pytest with coverage +commands = + pytest --cov-append --cov-branch \ + --cov={envsitepackagesdir}/acro/ \ + --cov={envsitepackagesdir}/countdown/ \ + --cov={envsitepackagesdir}/dice/ \ + --cov={envsitepackagesdir}/dispatch/ \ + --cov={envsitepackagesdir}/dr_botzo/ \ + --cov={envsitepackagesdir}/facts/ \ + --cov={envsitepackagesdir}/gitlab_bot/ \ + --cov={envsitepackagesdir}/ircbot/ \ + --cov={envsitepackagesdir}/karma/ \ + --cov={envsitepackagesdir}/markov/ \ + --cov={envsitepackagesdir}/mpdbot/ \ + --cov={envsitepackagesdir}/pi/ \ + --cov={envsitepackagesdir}/races/ \ + --cov={envsitepackagesdir}/seen/ \ + --cov={envsitepackagesdir}/storycraft/ \ + --cov={envsitepackagesdir}/transform/ \ + --cov={envsitepackagesdir}/twitter/ \ + --cov={envsitepackagesdir}/weather/ + +[testenv:coverage] +# report on coverage runs from above +skip_install = true +commands = + coverage report --fail-under=95 --show-missing + +[testenv:security] +# run security checks +# +# again it seems the most valuable here to run against the packaged code +commands = + bandit \ + {envsitepackagesdir}/acro/ \ + {envsitepackagesdir}/countdown/ \ + {envsitepackagesdir}/dice/ \ + {envsitepackagesdir}/dispatch/ \ + {envsitepackagesdir}/dr_botzo/ \ + {envsitepackagesdir}/facts/ \ + {envsitepackagesdir}/gitlab_bot/ \ + {envsitepackagesdir}/ircbot/ \ + {envsitepackagesdir}/karma/ \ + {envsitepackagesdir}/markov/ \ + {envsitepackagesdir}/mpdbot/ \ + {envsitepackagesdir}/pi/ \ + {envsitepackagesdir}/races/ \ + {envsitepackagesdir}/seen/ \ + {envsitepackagesdir}/storycraft/ \ + {envsitepackagesdir}/transform/ \ + {envsitepackagesdir}/twitter/ \ + {envsitepackagesdir}/weather/ \ + -r + +[testenv:lint] +# run style checks +commands = + flake8 + - flake8 --disable-noqa --ignore= --select=E,W,F,C,D,A,G,B,I,T,M,DUO + +[testenv:bundle] +# take extra actions (build sdist, sphinx, whatever) to completely package the app +commands = + cp -r {distdir} . + python setup.py sdist + +[coverage:paths] +source = + ./ + .tox/**/site-packages/ + +[coverage:run] +branch = True + +# redundant with pytest --cov above, but this tricks the coverage.xml report into +# using the full path, otherwise files with the same name in different paths +# get clobbered. maybe appends would fix this, IDK +include = + {envsitepackagesdir}/acro/ + {envsitepackagesdir}/countdown/ + {envsitepackagesdir}/dice/ + {envsitepackagesdir}/dispatch/ + {envsitepackagesdir}/dr_botzo/ + {envsitepackagesdir}/facts/ + {envsitepackagesdir}/gitlab_bot/ + {envsitepackagesdir}/ircbot/ + {envsitepackagesdir}/karma/ + {envsitepackagesdir}/markov/ + {envsitepackagesdir}/mpdbot/ + {envsitepackagesdir}/pi/ + {envsitepackagesdir}/races/ + {envsitepackagesdir}/seen/ + {envsitepackagesdir}/storycraft/ + {envsitepackagesdir}/transform/ + {envsitepackagesdir}/twitter/ + {envsitepackagesdir}/weather/ + +omit = + **/_version.py + +[flake8] +enable-extensions = G,M +exclude = + .tox/ + versioneer.py + _version.py + instance/ +extend-ignore = T101 +max-complexity = 10 +max-line-length = 120 + +[isort] +line_length = 120 + +[pytest] +python_files = + *_tests.py + tests.py + test_*.py +DJANGO_SETTINGS_MODULE = dr_botzo.settings +django_find_project = false