Compare commits

...

4 Commits

Author SHA1 Message Date
4d94322c55 refactor PiLog to retain x,y values 2020-10-24 11:47:36 -05:00
10d73f570a start using tox, despite 100000 errors 2020-10-24 10:06:41 -05:00
819bbe74c6 recompile requirements
basically everything changed here, so... fingers crossed
2020-10-24 10:06:37 -05:00
1833430c5d put requirements in my now-usual spot 2020-10-24 09:54:58 -05:00
15 changed files with 442 additions and 173 deletions

2
.gitignore vendored
View File

@ -3,6 +3,8 @@ build/
dist/ dist/
tags/ tags/
*.egg-info/ *.egg-info/
.tox/
.coverage
dr.botzo.data dr.botzo.data
dr.botzo.cfg dr.botzo.cfg
localsettings.py localsettings.py

View File

@ -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

View File

@ -1,21 +1,14 @@
# coding: utf-8 # coding: utf-8
"""Provide pi simulation results to IRC."""
import logging
from ircbot.lib import Plugin from ircbot.lib import Plugin
from pi.models import PiLog from pi.models import PiLog
log = logging.getLogger('pi.ircplugin')
class Pi(Plugin): class Pi(Plugin):
"""Use the Monte Carlo method to simulate pi.""" """Use the Monte Carlo method to simulate pi."""
def start(self): def start(self):
"""Set up the handlers.""" """Set up the handlers."""
self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!pi$', self.connection.reactor.add_global_regex_handler(['pubmsg', 'privmsg'], r'^!pi$',
self.handle_pi, -20) self.handle_pi, -20)
@ -23,17 +16,16 @@ class Pi(Plugin):
def stop(self): def stop(self):
"""Tear down handlers.""" """Tear down handlers."""
self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.handle_pi) self.connection.reactor.remove_global_regex_handler(['pubmsg', 'privmsg'], self.handle_pi)
super(Pi, self).stop() super(Pi, self).stop()
def handle_pi(self, connection, event, match): def handle_pi(self, connection, event, match):
"""Handle the pi command by generating another value and presenting it.""" """Handle the pi command by generating another value and presenting it."""
newest, x, y = PiLog.objects.simulate()
newest, x, y, hit = PiLog.objects.simulate()
msg = ("({0:.10f}, {1:.10f}) is {2}within the unit circle. π is {5:.10f}. (i:{3:d} p:{4:d})" msg = ("({0:.10f}, {1:.10f}) is {2}within the unit circle. π is {5:.10f}. (i:{3:d} p:{4:d})"
"".format(x, y, "" if hit else "not ", newest.count_inside, newest.count_total, newest.value())) "".format(x, y, "" if newest.hit else "not ", newest.total_count_inside,
newest.total_count, newest.value))
return self.bot.reply(event, msg) return self.bot.reply(event, msg)

View File

@ -0,0 +1,23 @@
# Generated by Django 3.1.2 on 2020-10-24 16:27
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('pi', '0002_auto_20150521_2204'),
]
operations = [
migrations.RenameField(
model_name='pilog',
old_name='count_total',
new_name='total_count',
),
migrations.RenameField(
model_name='pilog',
old_name='count_inside',
new_name='total_count_inside',
),
]

View File

@ -0,0 +1,25 @@
# Generated by Django 3.1.2 on 2020-10-24 16:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pi', '0003_rename_count_fields'),
]
operations = [
migrations.AddField(
model_name='pilog',
name='simulation_x',
field=models.DecimalField(decimal_places=10, default=0.0, max_digits=11),
preserve_default=False,
),
migrations.AddField(
model_name='pilog',
name='simulation_y',
field=models.DecimalField(decimal_places=10, default=0.0, max_digits=11),
preserve_default=False,
),
]

View File

@ -1,67 +1,67 @@
"""Karma logging models.""" """Karma logging models."""
import logging
import math import math
import pytz
import random import random
import pytz
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
log = logging.getLogger('pi.models')
class PiLogManager(models.Manager): class PiLogManager(models.Manager):
"""Assemble some queries against PiLog.""" """Assemble some queries against PiLog."""
def simulate(self): def simulate(self):
"""Add one more entry to the log, and return it.""" """Add one more entry to the log, and return it."""
try: try:
latest = self.latest() latest = self.latest()
except PiLog.DoesNotExist: except PiLog.DoesNotExist:
latest = PiLog(count_inside=0, count_total=0) latest = PiLog.objects.create(simulation_x=0.0, simulation_y=0.0,
total_count_inside=0, total_count=0)
latest.save() latest.save()
inside = latest.count_inside inside = latest.total_count_inside
total = latest.count_total total = latest.total_count
x = random.random() x = random.random()
y = random.random() y = random.random()
hit = True if math.hypot(x,y) < 1 else False total += 1
if math.hypot(x, y) < 1:
inside += 1
if hit: newest = PiLog.objects.create(simulation_x=x, simulation_y=y,
newest = PiLog(count_inside=inside+1, count_total=total+1) total_count_inside=inside, total_count=total)
else:
newest = PiLog(count_inside=inside, count_total=total+1)
newest.save()
return newest, x, y, hit return newest, x, y
class PiLog(models.Model): class PiLog(models.Model):
"""Track pi as it is estimated over time.""" """Track pi as it is estimated over time."""
count_inside = models.PositiveIntegerField() simulation_x = models.DecimalField(max_digits=11, decimal_places=10)
count_total = models.PositiveIntegerField() simulation_y = models.DecimalField(max_digits=11, decimal_places=10)
total_count_inside = models.PositiveIntegerField()
total_count = models.PositiveIntegerField()
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
objects = PiLogManager() objects = PiLogManager()
class Meta: class Meta:
"""Options for the PiLog class."""
get_latest_by = 'created' get_latest_by = 'created'
def __str__(self): def __str__(self):
"""String representation.""" """Provide string representation."""
tz = pytz.timezone(settings.TIME_ZONE) tz = pytz.timezone(settings.TIME_ZONE)
return "({0:d}/{1:d}) @ {2:s}".format(self.count_inside, self.count_total, return "({0:d}/{1:d}) @ {2:s}".format(self.total_count_inside, self.total_count,
self.created.astimezone(tz).strftime('%Y-%m-%d %H:%M:%S %Z')) self.created.astimezone(tz).strftime('%Y-%m-%d %H:%M:%S %Z'))
@property
def value(self): def value(self):
"""Return this log entry's value of pi.""" """Return this log entry's estimated value of pi."""
return 4.0 * int(self.total_count_inside) / int(self.total_count)
return 4.0 * int(self.count_inside) / int(self.count_total) @property
def hit(self):
"""Return if this log entry is inside the unit circle."""
return math.hypot(self.simulation_x, self.simulation.y) < 1

View File

@ -1,6 +0,0 @@
-r requirements.in
logilab-common # prospector thing, i guess
pip-tools # pip-compile
prospector # code quality
versioneer # auto-generate version numbers

View File

@ -1,68 +0,0 @@
#
# This file is autogenerated by pip-compile
# To update, run:
#
# pip-compile --output-file=requirements-dev.txt requirements-dev.in
#
astroid==2.2.5 # via pylint, pylint-celery, pylint-flask, requirements-detector
certifi==2019.6.16 # via requests
chardet==3.0.4 # via requests
click==7.0 # via pip-tools
django-adminplus==0.5
django-bootstrap3==11.0.0
django-extensions==2.1.9
django-registration-redux==2.6
django==2.2.2
djangorestframework==3.9.4
dodgy==0.1.9 # via prospector
future==0.17.1 # via parsedatetime
idna==2.8 # via requests
inflect==2.1.0 # via jaraco.itertools
irc==15.0.6
isort==4.3.20 # via pylint
jaraco.classes==2.0 # via jaraco.collections
jaraco.collections==2.0 # via irc
jaraco.functools==2.0 # via irc, jaraco.text, tempora
jaraco.itertools==4.4.2 # via irc
jaraco.logging==2.0 # via irc
jaraco.stream==2.0 # via irc
jaraco.text==3.0 # via irc, jaraco.collections
lazy-object-proxy==1.4.1 # via astroid
logilab-common==1.4.2
mccabe==0.6.1 # via prospector, pylint
more-itertools==7.0.0 # via irc, jaraco.functools, jaraco.itertools
oauthlib==3.0.1 # via requests-oauthlib
parsedatetime==2.4
pep8-naming==0.4.1 # via prospector
pip-tools==4.1.0
ply==3.11
prospector==1.1.6.4
pycodestyle==2.4.0 # via prospector
pydocstyle==3.0.0 # via prospector
pyflakes==1.6.0 # via prospector
pylint-celery==0.3 # via prospector
pylint-django==2.0.9 # via prospector
pylint-flask==0.6 # via prospector
pylint-plugin-utils==0.5 # via prospector, pylint-celery, pylint-django, pylint-flask
pylint==2.3.1 # via prospector, pylint-celery, pylint-django, pylint-flask, pylint-plugin-utils
python-dateutil==2.8.0
python-gitlab==1.9.0
python-mpd2==1.0.0
pytz==2019.1
pyyaml==5.1.1 # via prospector
requests-oauthlib==1.2.0 # via twython
requests==2.22.0 # via python-gitlab, requests-oauthlib, twython
requirements-detector==0.6 # via prospector
setoptconf==0.2.0 # via prospector
six==1.12.0 # via astroid, django-extensions, irc, jaraco.classes, jaraco.collections, jaraco.itertools, jaraco.logging, jaraco.stream, logilab-common, pip-tools, pydocstyle, python-dateutil, python-gitlab, tempora
snowballstemmer==1.2.1 # via pydocstyle
sqlparse==0.3.0 # via django
tempora==1.14.1 # via irc, jaraco.logging
twython==3.7.0
typed-ast==1.4.0 # via astroid
urllib3==1.25.3 # via requests
versioneer==0.18
wrapt==1.11.2 # via astroid
# The following packages are considered to be unsafe in a requirements file:
# setuptools==41.4.0 # via logilab-common

View File

@ -1,40 +0,0 @@
#
# This file is autogenerated by pip-compile
# To update, run:
#
# pip-compile --output-file=requirements.txt requirements.in
#
certifi==2019.6.16 # via requests
chardet==3.0.4 # via requests
django-adminplus==0.5
django-bootstrap3==11.0.0
django-extensions==2.1.9
django-registration-redux==2.6
django==2.2.2
djangorestframework==3.9.4
future==0.17.1 # via parsedatetime
idna==2.8 # via requests
inflect==2.1.0 # via jaraco.itertools
irc==15.0.6
jaraco.classes==2.0 # via jaraco.collections
jaraco.collections==2.0 # via irc
jaraco.functools==2.0 # via irc, jaraco.text, tempora
jaraco.itertools==4.4.2 # via irc
jaraco.logging==2.0 # via irc
jaraco.stream==2.0 # via irc
jaraco.text==3.0 # via irc, jaraco.collections
more-itertools==7.0.0 # via irc, jaraco.functools, jaraco.itertools
oauthlib==3.0.1 # via requests-oauthlib
parsedatetime==2.4
ply==3.11
python-dateutil==2.8.0
python-gitlab==1.9.0
python-mpd2==1.0.0
pytz==2019.1
requests-oauthlib==1.2.0 # via twython
requests==2.22.0 # via python-gitlab, requests-oauthlib, twython
six==1.12.0 # via django-extensions, irc, jaraco.classes, jaraco.collections, jaraco.itertools, jaraco.logging, jaraco.stream, python-dateutil, python-gitlab, tempora
sqlparse==0.3.0 # via django
tempora==1.14.1 # via irc, jaraco.logging
twython==3.7.0
urllib3==1.25.3 # via requests

View File

@ -0,0 +1,25 @@
-r requirements.in
# testing runner, test reporting, packages used during testing (e.g. requests-mock), etc.
pytest
pytest-cov
pytest-django
# linting and other static code analysis
bandit
dlint
flake8 # flake8 and plugins, for local dev linting in vim
flake8-blind-except
flake8-builtins
flake8-docstrings
flake8-executable
flake8-fixme
flake8-isort
flake8-logging-format
flake8-mutable
# maintenance utilities and tox
pip-tools # pip-compile
tox # CI stuff
tox-wheel # build wheels in tox
versioneer # automatic version numbering

View File

@ -0,0 +1,92 @@
#
# This file is autogenerated by pip-compile
# To update, run:
#
# pip-compile --output-file=requirements/requirements-dev.txt requirements/requirements-dev.in
#
appdirs==1.4.4 # via virtualenv
asgiref==3.2.10 # via django
attrs==20.2.0 # via pytest
bandit==1.6.2 # via -r requirements/requirements-dev.in
certifi==2020.6.20 # via requests
chardet==3.0.4 # via requests
click==7.1.2 # via pip-tools
coverage==5.3 # via pytest-cov
distlib==0.3.1 # via virtualenv
django-adminplus==0.5 # via -r requirements/requirements.in
django-bootstrap3==14.2.0 # via -r requirements/requirements.in
django-extensions==3.0.9 # via -r requirements/requirements.in
django-registration-redux==2.8 # via -r requirements/requirements.in
django==3.1.2 # via -r requirements/requirements.in, django-bootstrap3, djangorestframework
djangorestframework==3.12.1 # via -r requirements/requirements.in
dlint==0.10.3 # via -r requirements/requirements-dev.in
filelock==3.0.12 # via tox, virtualenv
flake8-blind-except==0.1.1 # via -r requirements/requirements-dev.in
flake8-builtins==1.5.3 # via -r requirements/requirements-dev.in
flake8-docstrings==1.5.0 # via -r requirements/requirements-dev.in
flake8-executable==2.0.4 # via -r requirements/requirements-dev.in
flake8-fixme==1.1.1 # via -r requirements/requirements-dev.in
flake8-isort==4.0.0 # via -r requirements/requirements-dev.in
flake8-logging-format==0.6.0 # via -r requirements/requirements-dev.in
flake8-mutable==1.2.0 # via -r requirements/requirements-dev.in
flake8==3.8.4 # via -r requirements/requirements-dev.in, dlint, flake8-builtins, flake8-docstrings, flake8-executable, flake8-isort, flake8-mutable
gitdb==4.0.5 # via gitpython
gitpython==3.1.11 # via bandit
idna==2.10 # via requests
importlib-metadata==1.7.0 # via django-bootstrap3, flake8, inflect, pluggy, pytest, stevedore, tox, virtualenv
importlib-resources==3.1.1 # via jaraco.text, virtualenv
inflect==4.1.0 # via jaraco.itertools
iniconfig==1.1.1 # via pytest
irc==15.0.6 # via -r requirements/requirements.in
isort==5.6.4 # via flake8-isort
jaraco.classes==3.1.0 # via jaraco.collections
jaraco.collections==3.0.0 # via irc
jaraco.functools==3.0.1 # via irc, jaraco.text, tempora
jaraco.itertools==5.0.0 # via irc
jaraco.logging==3.0.0 # via irc
jaraco.stream==3.0.0 # via irc
jaraco.text==3.2.0 # via irc, jaraco.collections
mccabe==0.6.1 # via flake8
more-itertools==8.5.0 # via irc, jaraco.classes, jaraco.functools, jaraco.itertools
oauthlib==3.1.0 # via requests-oauthlib
packaging==20.4 # via pytest, tox
parsedatetime==2.6 # via -r requirements/requirements.in
pbr==5.5.1 # via stevedore
pip-tools==5.3.1 # via -r requirements/requirements-dev.in
pluggy==0.13.1 # via pytest, tox
ply==3.11 # via -r requirements/requirements.in
py==1.9.0 # via pytest, tox
pycodestyle==2.6.0 # via flake8
pydocstyle==5.1.1 # via flake8-docstrings
pyflakes==2.2.0 # via flake8
pyparsing==2.4.7 # via packaging
pytest-cov==2.10.1 # via -r requirements/requirements-dev.in
pytest-django==4.1.0 # via -r requirements/requirements-dev.in
pytest==6.1.1 # via -r requirements/requirements-dev.in, pytest-cov, pytest-django
python-dateutil==2.8.1 # via -r requirements/requirements.in
python-gitlab==2.5.0 # via -r requirements/requirements.in
python-mpd2==1.1.0 # via -r requirements/requirements.in
pytz==2020.1 # via -r requirements/requirements.in, django, irc, tempora
pyyaml==5.3.1 # via bandit
requests-oauthlib==1.3.0 # via twython
requests==2.24.0 # via python-gitlab, requests-oauthlib, twython
six==1.15.0 # via bandit, irc, jaraco.collections, jaraco.logging, jaraco.text, packaging, pip-tools, python-dateutil, tox, virtualenv
smmap==3.0.4 # via gitdb
snowballstemmer==2.0.0 # via pydocstyle
sqlparse==0.4.1 # via django
stevedore==3.2.2 # via bandit
tempora==4.0.0 # via irc, jaraco.logging
testfixtures==6.15.0 # via flake8-isort
toml==0.10.1 # via pytest, tox
tox-wheel==0.5.0 # via -r requirements/requirements-dev.in
tox==3.20.1 # via -r requirements/requirements-dev.in, tox-wheel
twython==3.8.2 # via -r requirements/requirements.in
urllib3==1.25.11 # via requests
versioneer==0.18 # via -r requirements/requirements-dev.in
virtualenv==20.0.35 # via tox
wheel==0.35.1 # via tox-wheel
zipp==3.3.2 # via importlib-metadata, importlib-resources
# The following packages are considered to be unsafe in a requirements file:
# pip
# setuptools

View File

@ -0,0 +1,43 @@
#
# This file is autogenerated by pip-compile
# To update, run:
#
# pip-compile --output-file=requirements/requirements.txt requirements/requirements.in
#
asgiref==3.2.10 # via django
certifi==2020.6.20 # via requests
chardet==3.0.4 # via requests
django-adminplus==0.5 # via -r requirements/requirements.in
django-bootstrap3==14.2.0 # via -r requirements/requirements.in
django-extensions==3.0.9 # via -r requirements/requirements.in
django-registration-redux==2.8 # via -r requirements/requirements.in
django==3.1.2 # via -r requirements/requirements.in, django-bootstrap3, djangorestframework
djangorestframework==3.12.1 # via -r requirements/requirements.in
idna==2.10 # via requests
importlib-metadata==1.7.0 # via django-bootstrap3, inflect
importlib-resources==3.1.1 # via jaraco.text
inflect==4.1.0 # via jaraco.itertools
irc==15.0.6 # via -r requirements/requirements.in
jaraco.classes==3.1.0 # via jaraco.collections
jaraco.collections==3.0.0 # via irc
jaraco.functools==3.0.1 # via irc, jaraco.text, tempora
jaraco.itertools==5.0.0 # via irc
jaraco.logging==3.0.0 # via irc
jaraco.stream==3.0.0 # via irc
jaraco.text==3.2.0 # via irc, jaraco.collections
more-itertools==8.5.0 # via irc, jaraco.classes, jaraco.functools, jaraco.itertools
oauthlib==3.1.0 # via requests-oauthlib
parsedatetime==2.6 # via -r requirements/requirements.in
ply==3.11 # via -r requirements/requirements.in
python-dateutil==2.8.1 # via -r requirements/requirements.in
python-gitlab==2.5.0 # via -r requirements/requirements.in
python-mpd2==1.1.0 # via -r requirements/requirements.in
pytz==2020.1 # via -r requirements/requirements.in, django, irc, tempora
requests-oauthlib==1.3.0 # via twython
requests==2.24.0 # via python-gitlab, requests-oauthlib, twython
six==1.15.0 # via irc, jaraco.collections, jaraco.logging, jaraco.text, python-dateutil
sqlparse==0.4.1 # via django
tempora==4.0.0 # via irc, jaraco.logging
twython==3.8.2 # via -r requirements/requirements.in
urllib3==1.25.11 # via requests
zipp==3.3.2 # via importlib-metadata, importlib-resources

View File

@ -8,7 +8,7 @@ HERE = os.path.dirname(os.path.abspath(__file__))
def extract_requires(): def extract_requires():
with open(os.path.join(HERE, 'requirements.in'), 'r') as reqs: with open(os.path.join(HERE, 'requirements/requirements.in'), 'r') as reqs:
return [line.split(' ')[0] for line in reqs if not line[0] == '-'] return [line.split(' ')[0] for line in reqs if not line[0] == '-']

201
tox.ini Normal file
View File

@ -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