summaryrefslogtreecommitdiff
path: root/plugins/cmd2_ext_test/tasks.py
diff options
context:
space:
mode:
authorEric Lin <anselor@gmail.com>2020-07-07 13:59:43 -0400
committeranselor <anselor@gmail.com>2020-07-11 17:30:40 -0400
commit28e43bf24f8a5bc0b2e896938e76e17524d12ed3 (patch)
treeff423668e7e07233e65cf5b4958d3c0d768e69f0 /plugins/cmd2_ext_test/tasks.py
parentff64eff8854c9b52a1f48e4b843e9a738d2b388d (diff)
downloadcmd2-git-28e43bf24f8a5bc0b2e896938e76e17524d12ed3.tar.gz
Copied cmd2 ext test into cmd2 baseline and linked up invoke
Diffstat (limited to 'plugins/cmd2_ext_test/tasks.py')
-rw-r--r--plugins/cmd2_ext_test/tasks.py197
1 files changed, 197 insertions, 0 deletions
diff --git a/plugins/cmd2_ext_test/tasks.py b/plugins/cmd2_ext_test/tasks.py
new file mode 100644
index 00000000..6bb8d307
--- /dev/null
+++ b/plugins/cmd2_ext_test/tasks.py
@@ -0,0 +1,197 @@
+#
+# coding=utf-8
+# flake8: noqa E302
+"""Development related tasks to be run with 'invoke'.
+
+Make sure you satisfy the following Python module requirements if you are trying to publish a release to PyPI:
+ - twine >= 1.11.0
+ - wheel >= 0.31.0
+ - setuptools >= 39.1.0
+"""
+import os
+import pathlib
+import re
+import shutil
+import sys
+
+import invoke
+
+
+TASK_ROOT = pathlib.Path(__file__).resolve().parent
+TASK_ROOT_STR = str(TASK_ROOT)
+
+# 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"
+ with context.cd(TASK_ROOT_STR):
+ context.run("pytest --cov=cmd2_ext_test --cov-report=term --cov-report=html", pty=True)
+namespace.add_task(pytest)
+
+@invoke.task
+def pytest_junit(context):
+ "Run tests and code coverage using pytest"
+ with context.cd(TASK_ROOT_STR):
+ context.run("pytest --cov --junitxml=junit/test-results.xml", pty=True)
+namespace.add_task(pytest_junit)
+
+@invoke.task
+def pytest_clean(context):
+ "Remove pytest cache and code coverage files and directories"
+ #pylint: disable=unused-argument
+ with context.cd(TASK_ROOT_STR):
+ dirs = ['.pytest_cache', '.cache', 'htmlcov', '.coverage']
+ rmrf(dirs)
+namespace_clean.add_task(pytest_clean, 'pytest')
+
+@invoke.task
+def mypy(context):
+ "Run mypy optional static type checker"
+ with context.cd(TASK_ROOT_STR):
+ context.run("mypy main.py")
+ namespace.add_task(mypy)
+namespace.add_task(mypy)
+
+@invoke.task
+def mypy_clean(context):
+ "Remove mypy cache directory"
+ #pylint: disable=unused-argument
+ with context.cd(TASK_ROOT_STR):
+ dirs = ['.mypy_cache', 'dmypy.json', 'dmypy.sock']
+ rmrf(dirs)
+namespace_clean.add_task(mypy_clean, 'mypy')
+
+
+#####
+#
+# documentation
+#
+#####
+
+
+#####
+#
+# build and distribute
+#
+#####
+BUILDDIR = 'build'
+DISTDIR = 'dist'
+
+@invoke.task
+def build_clean(context):
+ "Remove the build directory"
+ #pylint: disable=unused-argument
+ with context.cd(TASK_ROOT_STR):
+ rmrf(BUILDDIR)
+
+namespace_clean.add_task(build_clean, 'build')
+
+@invoke.task
+def dist_clean(context):
+ "Remove the dist directory"
+ #pylint: disable=unused-argument
+ with context.cd(TASK_ROOT_STR):
+ rmrf(DISTDIR)
+namespace_clean.add_task(dist_clean, 'dist')
+
+@invoke.task
+def eggs_clean(context):
+ "Remove egg directories"
+ #pylint: disable=unused-argument
+ with context.cd(TASK_ROOT_STR):
+ 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
+ with context.cd(TASK_ROOT_STR):
+ 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"
+ with context.cd(TASK_ROOT_STR):
+ context.run('python setup.py sdist')
+namespace.add_task(sdist)
+
+@invoke.task(pre=[clean_all])
+def wheel(context):
+ "Build a wheel distribution"
+ with context.cd(TASK_ROOT_STR):
+ 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"
+ with context.cd(TASK_ROOT_STR):
+ 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"
+ with context.cd(TASK_ROOT_STR):
+ context.run('twine upload --repository-url https://test.pypi.org/legacy/ dist/*')
+namespace.add_task(pypi_test)
+
+
+# Flake8 - linter and tool for style guide enforcement and linting
+@invoke.task
+def flake8(context):
+ "Run flake8 linter and tool for style guide enforcement"
+ with context.cd(TASK_ROOT_STR):
+ context.run("flake8 --ignore=E252,W503 --max-complexity=26 --max-line-length=127 --show-source --statistics --exclude=.git,__pycache__,.tox,.eggs,*.egg,.venv,.idea,.pytest_cache,.vscode,build,dist,htmlcov")
+namespace.add_task(flake8)