diff options
author | kotfu <kotfu@kotfu.net> | 2018-05-28 22:21:45 -0600 |
---|---|---|
committer | kotfu <kotfu@kotfu.net> | 2018-05-28 22:21:45 -0600 |
commit | b0965f1bb19fb2e8041abeb4b27eeb89f450a48a (patch) | |
tree | e5b3a4987b5dfdd22ce7f45a6373dc0b10e88442 /tasks.py | |
parent | 4b87d49f07d880bd9536e3193f0f123b9bef0fad (diff) | |
parent | 7000604ac826a637539c388ad8f5ff8a3ebfc419 (diff) | |
download | cmd2-git-b0965f1bb19fb2e8041abeb4b27eeb89f450a48a.tar.gz |
Merge branch 'master' into plugin_functions
Diffstat (limited to 'tasks.py')
-rw-r--r-- | tasks.py | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/tasks.py b/tasks.py new file mode 100644 index 00000000..000af0a5 --- /dev/null +++ b/tasks.py @@ -0,0 +1,178 @@ +# +# coding=utf-8 +"""Development related tasks to be run with 'invoke'""" + +import os +import shutil + +import invoke + +# shared function +def rmrf(items, verbose=True): + "Silently remove a list of directories or files" + if isinstance(items, str): + items = [items] + + for item in items: + if verbose: + print("Removing {}".format(item)) + shutil.rmtree(item, ignore_errors=True) + # rmtree doesn't remove bare files + try: + os.remove(item) + except FileNotFoundError: + pass + + +# create namespaces +namespace = invoke.Collection() +namespace_clean = invoke.Collection('clean') +namespace.add_collection(namespace_clean, 'clean') + +##### +# +# pytest, tox, pylint, and codecov +# +##### +@invoke.task +def pytest(context): + "Run tests and code coverage using pytest" + context.run("pytest --cov=cmd2 --cov-report=term --cov-report=html") +namespace.add_task(pytest) + +@invoke.task +def pytest_clean(context): + "Remove pytest cache and code coverage files and directories" + #pylint: disable=unused-argument + dirs = ['.pytest-cache', '.cache', 'htmlcov', '.coverage'] + rmrf(dirs) +namespace_clean.add_task(pytest_clean, 'pytest') + +@invoke.task +def tox(context): + "Run unit and integration tests on multiple python versions using tox" + context.run("tox") +namespace.add_task(tox) + +@invoke.task +def tox_clean(context): + "Remove tox virtualenvs and logs" + #pylint: disable=unused-argument + rmrf('.tox') +namespace_clean.add_task(tox_clean, 'tox') + + +##### +# +# documentation +# +##### +DOCS_SRCDIR = 'docs' +DOCS_BUILDDIR = os.path.join('docs', '_build') + +@invoke.task() +def docs(context, builder='html'): + "Build documentation using sphinx" + cmdline = 'python -msphinx -M {} {} {}'.format(builder, DOCS_SRCDIR, DOCS_BUILDDIR) + context.run(cmdline) +namespace.add_task(docs) + +@invoke.task +def docs_clean(context): + "Remove rendered documentation" + #pylint: disable=unused-argument + rmrf(DOCS_BUILDDIR) +namespace_clean.add_task(docs_clean, name='docs') + +@invoke.task +def livehtml(context): + "Launch webserver on http://localhost:8000 with rendered documentation" + builder = 'html' + outputdir = os.path.join(DOCS_BUILDDIR, builder) + cmdline = 'sphinx-autobuild -b {} {} {}'.format(builder, DOCS_SRCDIR, outputdir) + context.run(cmdline, pty=True) +namespace.add_task(livehtml) + + +##### +# +# build and distribute +# +##### +BUILDDIR = 'build' +DISTDIR = 'dist' + +@invoke.task +def build_clean(context): + "Remove the build directory" + #pylint: disable=unused-argument + rmrf(BUILDDIR) +namespace_clean.add_task(build_clean, 'build') + +@invoke.task +def dist_clean(context): + "Remove the dist directory" + #pylint: disable=unused-argument + rmrf(DISTDIR) +namespace_clean.add_task(dist_clean, 'dist') + +@invoke.task +def eggs_clean(context): + "Remove egg directories" + #pylint: disable=unused-argument + dirs = set() + dirs.add('.eggs') + for name in os.listdir(os.curdir): + if name.endswith('.egg-info'): + dirs.add(name) + if name.endswith('.egg'): + dirs.add(name) + rmrf(dirs) +namespace_clean.add_task(eggs_clean, 'eggs') + +@invoke.task +def pycache_clean(context): + "Remove __pycache__ directories" + #pylint: disable=unused-argument + dirs = set() + for root, dirnames, _ in os.walk(os.curdir): + if '__pycache__' in dirnames: + dirs.add(os.path.join(root, '__pycache__')) + print("Removing __pycache__ directories") + rmrf(dirs, verbose=False) +namespace_clean.add_task(pycache_clean, 'pycache') + +# +# make a dummy clean task which runs all the tasks in the clean namespace +clean_tasks = list(namespace_clean.tasks.values()) +@invoke.task(pre=list(namespace_clean.tasks.values()), default=True) +def clean_all(context): + "Run all clean tasks" + #pylint: disable=unused-argument + pass +namespace_clean.add_task(clean_all, 'all') + +@invoke.task(pre=[clean_all]) +def sdist(context): + "Create a source distribution" + context.run('python setup.py sdist') +namespace.add_task(sdist) + +@invoke.task(pre=[clean_all]) +def wheel(context): + "Build a wheel distribution" + context.run('python setup.py bdist_wheel') +namespace.add_task(wheel) + +@invoke.task(pre=[sdist, wheel]) +def pypi(context): + "Build and upload a distribution to pypi" + context.run('twine upload dist/*') +namespace.add_task(pypi) + +@invoke.task(pre=[sdist, wheel]) +def pypi_test(context): + "Build and upload a distribution to https://test.pypi.org" + context.run('twine upload --repository-url https://test.pypi.org/legacy/ dist/*') +namespace.add_task(pypi_test) + |