123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- """Click commands."""
- import os
- from glob import glob
- from subprocess import call
- import click
- from flask import current_app
- from flask.cli import with_appcontext
- from werkzeug.exceptions import MethodNotAllowed, NotFound
- HERE = os.path.abspath(os.path.dirname(__file__))
- PROJECT_ROOT = os.path.join(HERE, os.pardir)
- TEST_PATH = os.path.join(PROJECT_ROOT, 'tests')
- @click.command()
- def test():
- """Run the tests."""
- import pytest
- rv = pytest.main([TEST_PATH, '--verbose'])
- exit(rv)
- @click.command()
- @click.option('-f', '--fix-imports', default=False, is_flag=True,
- help='Fix imports using isort, before linting')
- def lint(fix_imports):
- """Lint and check code style with flake8 and isort."""
- skip = ['requirements']
- root_files = glob('*.py')
- root_directories = [
- name for name in next(os.walk('.'))[1] if not name.startswith('.')]
- files_and_directories = [
- arg for arg in root_files + root_directories if arg not in skip]
- def execute_tool(description, *args):
- """Execute a checking tool with its arguments."""
- command_line = list(args) + files_and_directories
- click.echo('{}: {}'.format(description, ' '.join(command_line)))
- rv = call(command_line)
- if rv != 0:
- exit(rv)
- if fix_imports:
- execute_tool('Fixing import order', 'isort', '-rc')
- execute_tool('Checking code style', 'flake8')
- @click.command()
- def clean():
- """Remove *.pyc and *.pyo files recursively starting at current directory.
- Borrowed from Flask-Script, converted to use Click.
- """
- for dirpath, dirnames, filenames in os.walk('.'):
- for filename in filenames:
- if filename.endswith('.pyc') or filename.endswith('.pyo'):
- full_pathname = os.path.join(dirpath, filename)
- click.echo('Removing {}'.format(full_pathname))
- os.remove(full_pathname)
- @click.command()
- @click.option('--url', default=None,
- help='Url to test (ex. /static/image.png)')
- @click.option('--order', default='rule',
- help='Property on Rule to order by (default: rule)')
- @with_appcontext
- def urls(url, order):
- """Display all of the url matching routes for the project.
- Borrowed from Flask-Script, converted to use Click.
- """
- rows = []
- column_length = 0
- column_headers = ('Rule', 'Endpoint', 'Arguments')
- if url:
- try:
- rule, arguments = (
- current_app.url_map
- .bind('localhost')
- .match(url, return_rule=True))
- rows.append((rule.rule, rule.endpoint, arguments))
- column_length = 3
- except (NotFound, MethodNotAllowed) as e:
- rows.append(('<{}>'.format(e), None, None))
- column_length = 1
- else:
- rules = sorted(
- current_app.url_map.iter_rules(),
- key=lambda rule: getattr(rule, order))
- for rule in rules:
- rows.append((rule.rule, rule.endpoint, None))
- column_length = 2
- str_template = ''
- table_width = 0
- if column_length >= 1:
- max_rule_length = max(len(r[0]) for r in rows)
- max_rule_length = max_rule_length if max_rule_length > 4 else 4
- str_template += '{:' + str(max_rule_length) + '}'
- table_width += max_rule_length
- if column_length >= 2:
- max_endpoint_length = max(len(str(r[1])) for r in rows)
-
- max_endpoint_length = (
- max_endpoint_length if max_endpoint_length > 8 else 8)
- str_template += ' {:' + str(max_endpoint_length) + '}'
- table_width += 2 + max_endpoint_length
- if column_length >= 3:
- max_arguments_length = max(len(str(r[2])) for r in rows)
- max_arguments_length = (
- max_arguments_length if max_arguments_length > 9 else 9)
- str_template += ' {:' + str(max_arguments_length) + '}'
- table_width += 2 + max_arguments_length
- click.echo(str_template.format(*column_headers[:column_length]))
- click.echo('-' * table_width)
- for row in rows:
- click.echo(str_template.format(*row[:column_length]))
|