Merge branch 'v0.6' into POW

This commit is contained in:
Biryuzovye Kleshni 2018-06-28 14:20:56 +00:00 committed by GitHub
commit 6fb637d1df
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 79 additions and 6 deletions

View File

@ -17,7 +17,7 @@ For more help on a particular command
from fabric.api import env from fabric.api import env
from fabfile.tasks import code_quality, build_docs, push_docs, clean from fabfile.tasks import code_quality, build_docs, push_docs, clean, test
# Without this, `fab -l` would display the whole docstring as preamble # Without this, `fab -l` would display the whole docstring as preamble
@ -26,6 +26,7 @@ __doc__ = ""
# This list defines which tasks are made available to the user # This list defines which tasks are made available to the user
__all__ = [ __all__ = [
"code_quality", "code_quality",
"test",
"build_docs", "build_docs",
"push_docs", "push_docs",
"clean", "clean",

View File

@ -6,8 +6,10 @@ A library of functions and constants for tasks to make use of.
import os import os
import sys import sys
import re
from functools import wraps
from fabric.api import run, hide from fabric.api import run, hide, cd, env
from fabric.context_managers import settings, shell_env from fabric.context_managers import settings, shell_env
from fabvenv import virtualenv from fabvenv import virtualenv
@ -18,6 +20,14 @@ VENV_ROOT = os.path.expanduser(os.path.join('~', '.virtualenvs', 'pybitmessage-d
PYTHONPATH = os.path.join(PROJECT_ROOT, 'src',) PYTHONPATH = os.path.join(PROJECT_ROOT, 'src',)
def coerce_list(value):
"""Coerce a value into a list"""
if isinstance(value, str):
return value.split(',')
else:
sys.exit("Bad string value {}".format(value))
def coerce_bool(value): def coerce_bool(value):
"""Coerce a value into a boolean""" """Coerce a value into a boolean"""
if isinstance(value, bool): if isinstance(value, bool):
@ -51,6 +61,29 @@ def flatten(data):
return result return result
def filelist_from_git(rev=None):
"""Return a list of files based on git output"""
cmd = 'git diff --name-only'
if rev:
if rev in ['cached', 'staged']:
cmd += ' --{}'.format(rev)
elif rev == 'working':
pass
else:
cmd += ' -r {}'.format(rev)
with cd(PROJECT_ROOT):
with hide('running', 'stdout'):
results = []
ansi_escape = re.compile(r'\x1B\[[0-?]*[ -/]*[@-~]')
clean = ansi_escape.sub('', run(cmd))
clean = re.sub('\n', '', clean)
for line in clean.split('\r'):
if line.endswith(".py"):
results.append(os.path.abspath(line))
return results
def pycodestyle(path_to_file): def pycodestyle(path_to_file):
"""Run pycodestyle on a file""" """Run pycodestyle on a file"""
with virtualenv(VENV_ROOT): with virtualenv(VENV_ROOT):
@ -148,3 +181,20 @@ def get_filtered_pylint_output(path_to_file):
not i.startswith('Using config file'), not i.startswith('Using config file'),
]) ])
] ]
def default_hosts(hosts):
"""Decorator to apply default hosts to a task"""
def real_decorator(func):
"""Manipulate env"""
env.hosts = env.hosts or hosts
@wraps(func)
def wrapper(*args, **kwargs):
"""Original function called from here"""
return func(*args, **kwargs)
return wrapper
return real_decorator

View File

@ -15,7 +15,7 @@ from fabric.contrib.project import rsync_project
from fabvenv import virtualenv from fabvenv import virtualenv
from fabfile.lib import ( from fabfile.lib import (
autopep8, PROJECT_ROOT, VENV_ROOT, coerce_bool, flatten, autopep8, PROJECT_ROOT, VENV_ROOT, coerce_bool, flatten, filelist_from_git, default_hosts,
get_filtered_pycodestyle_output, get_filtered_flake8_output, get_filtered_pylint_output, get_filtered_pycodestyle_output, get_filtered_flake8_output, get_filtered_pylint_output,
) )
@ -45,7 +45,7 @@ def get_tool_results(file_list):
def print_results(results, top, verbose, details): def print_results(results, top, verbose, details):
"""Print an item with the appropriate verbosity / detail""" """Print an item with the appropriate verbosity / detail"""
if verbose: if verbose and results:
print ''.join( print ''.join(
[ [
os.linesep, os.linesep,
@ -160,7 +160,8 @@ def create_dependency_graphs():
@task @task
def code_quality(verbose=True, details=False, fix=False, filename=None, top=10): @default_hosts(['localhost'])
def code_quality(verbose=True, details=False, fix=False, filename=None, top=10, rev=None):
""" """
Check code quality. Check code quality.
@ -171,6 +172,8 @@ def code_quality(verbose=True, details=False, fix=False, filename=None, top=10):
$ fab -H localhost code_quality $ fab -H localhost code_quality
:param rev: If not None, act on files changed since this commit. 'cached/staged' and 'working' have special meaning
:type rev: str or None, default None
:param top: Display / fix only the top N violating files, a value of 0 will display / fix all files :param top: Display / fix only the top N violating files, a value of 0 will display / fix all files
:type top: int, default 10 :type top: int, default 10
:param verbose: Display a header and the counts, without this you just get the filenames in order :param verbose: Display a header and the counts, without this you just get the filenames in order
@ -187,13 +190,14 @@ def code_quality(verbose=True, details=False, fix=False, filename=None, top=10):
Intended to be temporary until we have improved code quality and have safeguards to maintain it in place. Intended to be temporary until we have improved code quality and have safeguards to maintain it in place.
""" """
# pylint: disable=too-many-arguments
verbose = coerce_bool(verbose) verbose = coerce_bool(verbose)
details = coerce_bool(details) details = coerce_bool(details)
fix = coerce_bool(fix) fix = coerce_bool(fix)
top = int(top) or -1 top = int(top) or -1
file_list = generate_file_list(filename) file_list = generate_file_list(filename) if not rev else filelist_from_git(rev)
results = get_tool_results(file_list) results = get_tool_results(file_list)
if fix: if fix:
@ -207,6 +211,22 @@ def code_quality(verbose=True, details=False, fix=False, filename=None, top=10):
@task @task
@default_hosts(['localhost'])
def test():
"""Run tests on the code"""
with cd(PROJECT_ROOT):
with virtualenv(VENV_ROOT):
run('pip uninstall -y pybitmessage')
run('python setup.py install')
run('pybitmessage -t')
run('python setup.py test')
@task
@default_hosts(['localhost'])
def build_docs(dep_graph=False, apidoc=True): def build_docs(dep_graph=False, apidoc=True):
""" """
Build the documentation locally. Build the documentation locally.
@ -259,6 +279,7 @@ def build_docs(dep_graph=False, apidoc=True):
@task @task
@default_hosts(['localhost'])
def push_docs(path=None): def push_docs(path=None):
""" """
Upload the generated docs to a public server. Upload the generated docs to a public server.
@ -289,6 +310,7 @@ def push_docs(path=None):
@task @task
@default_hosts(['localhost'])
def clean(): def clean():
"""Clean up files generated by fabric commands.""" """Clean up files generated by fabric commands."""
with hide('running', 'stdout'): with hide('running', 'stdout'):