From 75a8742ca4f43eb5b9e87f6fe35d7f33f7e0ea1f Mon Sep 17 00:00:00 2001 From: "Allen, Timothy" Date: Fri, 12 Jun 2020 20:55:15 -0400 Subject: [PATCH 1/4] After major surgery, this gets us to 10 failed tests, 9 passed, 6 skipped. --- .travis.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index e02b53b..0e88a35 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,19 +9,14 @@ addons: packages: - pypy - python3.6 - - python3.7 - - python3.8 python: - "3.6" - - "3.7" - - "3.8" env: matrix: - - TOXENV=py36-dj22 - - TOXENV=py37-dj22 - - TOXENV=py38-dj22 + - TOXENV=dj22 + - TOXENV=dj30 - TOXENV=flake8 From c3337038f32900ebc5e606c621f1f28b537f64b8 Mon Sep 17 00:00:00 2001 From: "Allen, Timothy" Date: Fri, 12 Jun 2020 20:57:24 -0400 Subject: [PATCH 2/4] Paint it Black. --- .gitignore | 3 +- djclick/__init__.py | 10 +- djclick/adapter.py | 105 ++++++----- djclick/params.py | 12 +- djclick/test/conftest.py | 6 +- djclick/test/test_adapter.py | 163 +++++++++--------- djclick/test/test_params.py | 26 +-- .../testapp/management/commands/colorcmd.py | 4 +- .../testapp/management/commands/errcmd.py | 4 +- .../testapp/management/commands/groupcmd.py | 8 +- .../testapp/management/commands/helpcmd.py | 2 +- .../testapp/management/commands/modelcmd.py | 7 +- .../management/commands/requiredargcmd.py | 2 +- .../testapp/management/commands/testcmd.py | 2 +- .../testapp/management/commands/versioncmd.py | 2 +- djclick/test/testprj/testprj/settings.py | 68 ++++---- djclick/test/testprj/testprj/settings_alt.py | 2 +- djclick/test/testprj/testprj/urls.py | 2 +- setup.py | 105 +++++------ 19 files changed, 275 insertions(+), 258 deletions(-) diff --git a/.gitignore b/.gitignore index c5033f3..f60dae8 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ __pycache__ /docs/_build /.htmlcov *.egg-info/ -.vscode/ \ No newline at end of file +.vscode/ +venv/ diff --git a/djclick/__init__.py b/djclick/__init__.py index 1c0a885..2d9283d 100644 --- a/djclick/__init__.py +++ b/djclick/__init__.py @@ -8,11 +8,11 @@ from .adapter import GroupRegistrator as group, pass_verbosity # NOQA -__version__ = '2.2.0' -__url__ = 'https://github.com/GaretJax/django-click' -__author__ = 'Jonathan Stoppani' -__email__ = 'jonathan@stoppani.name' -__license__ = 'MIT' +__version__ = "2.2.0" +__url__ = "https://github.com/GaretJax/django-click" +__author__ = "Jonathan Stoppani" +__email__ = "jonathan@stoppani.name" +__license__ = "MIT" del click diff --git a/djclick/adapter.py b/djclick/adapter.py index 8cc6147..1233a15 100644 --- a/djclick/adapter.py +++ b/djclick/adapter.py @@ -12,6 +12,7 @@ class OptionParseAdapter(object): """Django pre-1.10-compatible adapter, deprecated""" + def parse_args(self, args): return (self, None) # NOCOV @@ -22,7 +23,7 @@ def __init__(self, args): def _get_kwargs(self): return { - 'args': self._args, + "args": self._args, } @@ -43,8 +44,7 @@ class DjangoCommandMixin(object): @property def stealth_options(self): return sum( - ([p.name] + [i.lstrip('-') for i in p.opts] for p in self.params), - [], + ([p.name] + [i.lstrip("-") for i in p.opts] for p in self.params), [], ) def invoke(self, ctx): @@ -54,7 +54,9 @@ def invoke(self, ctx): # Honor the --traceback flag if ctx.traceback: # NOCOV raise - styled_message = click.style('{}: {}'.format(e.__class__.__name__, e), fg='red', bold=True) + styled_message = click.style( + "{}: {}".format(e.__class__.__name__, e), fg="red", bold=True + ) click.echo(styled_message, err=True) ctx.exit(1) @@ -62,14 +64,16 @@ def run_from_argv(self, argv): """ Called when run from the command line. """ - prog_name = '{} {}'.format(os.path.basename(argv[0]), argv[1]) + prog_name = "{} {}".format(os.path.basename(argv[0]), argv[1]) try: # We won't get an exception here in standalone_mode=False - exit_code = self.main(args=argv[2:], prog_name=prog_name, standalone_mode=False) + exit_code = self.main( + args=argv[2:], prog_name=prog_name, standalone_mode=False + ) if exit_code: sys.exit(exit_code) except click.ClickException as e: - if getattr(e.ctx, 'traceback', False): # NOCOV + if getattr(e.ctx, "traceback", False): # NOCOV raise e.show() sys.exit(e.exit_code) @@ -84,13 +88,13 @@ def create_parser(self, progname, subcommand): return OptionParseAdapter() def print_help(self, prog_name, subcommand): - prog_name = '{} {}'.format(prog_name, subcommand) - self.main(['--help'], prog_name=prog_name, standalone_mode=False) + prog_name = "{} {}".format(prog_name, subcommand) + self.main(["--help"], prog_name=prog_name, standalone_mode=False) def map_names(self): for param in self.params: for opt in param.opts: - yield opt.lstrip('--').replace('-', '_'), param.name + yield opt.lstrip("--").replace("-", "_"), param.name def execute(self, *args, **kwargs): """ @@ -100,13 +104,14 @@ def execute(self, *args, **kwargs): `call_command`. """ # Remove internal Django command handling machinery - kwargs.pop('skip_checks', None) + kwargs.pop("skip_checks", None) parent_ctx = click.get_current_context(silent=True) - with self.make_context('', list(args), parent=parent_ctx) as ctx: + with self.make_context("", list(args), parent=parent_ctx) as ctx: # Rename kwargs to to the appropriate destination argument name opt_mapping = dict(self.map_names()) - arg_options = {opt_mapping.get(key, key): value - for key, value in six.iteritems(kwargs)} + arg_options = { + opt_mapping.get(key, key): value for key, value in six.iteritems(kwargs) + } # Update the context with the passed (renamed) kwargs ctx.params.update(arg_options) @@ -150,53 +155,63 @@ def suppress_colors(ctx, param, value): class BaseRegistrator(object): common_options = [ click.option( - '-v', '--verbosity', + "-v", + "--verbosity", expose_value=False, - default='1', + default="1", callback=register_on_context, type=click.IntRange(min=0, max=3), - help=('Verbosity level; 0=minimal output, 1=normal ''output, ' - '2=verbose output, 3=very verbose output.'), + help=( + "Verbosity level; 0=minimal output, 1=normal " + "output, " + "2=verbose output, 3=very verbose output." + ), ), click.option( - '--settings', - metavar='SETTINGS', + "--settings", + metavar="SETTINGS", expose_value=False, - help=('The Python path to a settings module, e.g. ' - '"myproject.settings.main". If this is not provided, the ' - 'DJANGO_SETTINGS_MODULE environment variable will be used.'), + help=( + "The Python path to a settings module, e.g. " + '"myproject.settings.main". If this is not provided, the ' + "DJANGO_SETTINGS_MODULE environment variable will be used." + ), ), click.option( - '--pythonpath', - metavar='PYTHONPATH', + "--pythonpath", + metavar="PYTHONPATH", expose_value=False, - help=('A directory to add to the Python path, e.g. ' - '"/home/djangoprojects/myproject".'), + help=( + "A directory to add to the Python path, e.g. " + '"/home/djangoprojects/myproject".' + ), ), click.option( - '--traceback/--no-traceback', + "--traceback/--no-traceback", is_flag=True, default=False, expose_value=False, callback=register_on_context, - help='Raise on CommandError exceptions.', + help="Raise on CommandError exceptions.", ), click.option( - '--color/--no-color', + "--color/--no-color", default=None, expose_value=False, callback=suppress_colors, - help=('Enable or disable output colorization. Default is to ' - 'autodetect the best behavior.'), + help=( + "Enable or disable output colorization. Default is to " + "autodetect the best behavior." + ), ), ] def __init__(self, **kwargs): self.kwargs = kwargs - self.version = self.kwargs.pop('version', get_version()) + self.version = self.kwargs.pop("version", get_version()) - context_settings = kwargs.setdefault('context_settings', {}) - context_settings['help_option_names'] = ['-h', '--help'] + context_settings = kwargs.setdefault("context_settings", {}) + context_settings["help_option_names"] = ["-h", "--help"] def get_params(self, name): def show_help(ctx, param, value): @@ -205,17 +220,23 @@ def show_help(ctx, param, value): ctx.exit() return [ - click.version_option(version=self.version, message='%(version)s'), - click.option('-h', '--help', is_flag=True, is_eager=True, - expose_value=False, callback=show_help, - help='Show this message and exit.',), + click.version_option(version=self.version, message="%(version)s"), + click.option( + "-h", + "--help", + is_flag=True, + is_eager=True, + expose_value=False, + callback=show_help, + help="Show this message and exit.", + ), ] + self.common_options def __call__(self, func): module = sys.modules[func.__module__] # Get the command name as Django expects it - self.name = func.__module__.rsplit('.', 1)[-1] + self.name = func.__module__.rsplit(".", 1)[-1] # Build the click command decorators = [ @@ -237,9 +258,11 @@ def pass_verbosity(f): """ Marks a callback as wanting to receive the verbosity as a keyword argument. """ + def new_func(*args, **kwargs): - kwargs['verbosity'] = click.get_current_context().verbosity + kwargs["verbosity"] = click.get_current_context().verbosity return f(*args, **kwargs) + return update_wrapper(new_func, f) diff --git a/djclick/params.py b/djclick/params.py index 75c9da5..5062731 100644 --- a/djclick/params.py +++ b/djclick/params.py @@ -4,16 +4,13 @@ class ModelInstance(click.ParamType): - def __init__(self, qs, lookup='pk'): + def __init__(self, qs, lookup="pk"): from django.db import models if isinstance(qs, type) and issubclass(qs, models.Model): qs = qs.objects.all() self.qs = qs - self.name = '{}.{}'.format( - qs.model._meta.app_label, - qs.model.__name__, - ) + self.name = "{}.{}".format(qs.model._meta.app_label, qs.model.__name__,) self.lookup = lookup def convert(self, value, param, ctx): @@ -25,6 +22,7 @@ def convert(self, value, param, ctx): pass # call `fail` outside of exception context to avoid nested exception # handling on Python 3 - msg = 'could not find {s.name} with {s.lookup}={value}'.format( - s=self, value=value) + msg = "could not find {s.name} with {s.lookup}={value}".format( + s=self, value=value + ) self.fail(msg, param, ctx) diff --git a/djclick/test/conftest.py b/djclick/test/conftest.py index b89f979..3a83f90 100644 --- a/djclick/test/conftest.py +++ b/djclick/test/conftest.py @@ -6,14 +6,14 @@ import pytest -@pytest.fixture(scope='session') +@pytest.fixture(scope="session") def manage(): def call(*args, **kwargs): - ignore_errors = kwargs.pop('ignore_errors', False) + ignore_errors = kwargs.pop("ignore_errors", False) assert not kwargs cmd = [ sys.executable, - os.path.join(os.path.dirname(__file__), 'testprj', 'manage.py'), + os.path.join(os.path.dirname(__file__), "testprj", "manage.py"), ] + list(args) try: return subprocess.check_output(cmd, stderr=subprocess.STDOUT) diff --git a/djclick/test/test_adapter.py b/djclick/test/test_adapter.py index d66bfd0..cc35f49 100644 --- a/djclick/test/test_adapter.py +++ b/djclick/test/test_adapter.py @@ -16,10 +16,10 @@ import djclick -todo = pytest.mark.xfail(reason='TODO') +todo = pytest.mark.xfail(reason="TODO") -@pytest.mark.skipif(not six.PY3, reason='Only necessary on Python3') +@pytest.mark.skipif(not six.PY3, reason="Only necessary on Python3") def test_not_ascii(): # NOCOV """ Make sure that the systems preferred encoding is not `ascii`. @@ -35,60 +35,60 @@ def test_not_ascii(): # NOCOV preferred_encoding = locale.getpreferredencoding() fs_enc = codecs.lookup(preferred_encoding).name except Exception: - fs_enc = 'ascii' - assert fs_enc != 'ascii' + fs_enc = "ascii" + assert fs_enc != "ascii" def test_attributes(): for attr in dir(click): - if not attr.startswith('_'): + if not attr.startswith("_"): assert hasattr(djclick, attr) def test_command_recognized(): - assert 'testcmd' in get_commands() + assert "testcmd" in get_commands() def test_call_cli(): - execute_from_command_line(['./manage.py', 'testcmd']) + execute_from_command_line(["./manage.py", "testcmd"]) with pytest.raises(RuntimeError): - execute_from_command_line(['./manage.py', 'testcmd', '--raise']) + execute_from_command_line(["./manage.py", "testcmd", "--raise"]) def test_call_command_args(): - call_command('testcmd') + call_command("testcmd") with pytest.raises(RuntimeError): - call_command('testcmd', '-r') + call_command("testcmd", "-r") with pytest.raises(RuntimeError): - call_command('testcmd', '--raise') + call_command("testcmd", "--raise") def test_call_command_required_args(): - call_command('requiredargcmd', 'arg1') + call_command("requiredargcmd", "arg1") with pytest.raises(click.MissingParameter): - call_command('requiredargcmd') + call_command("requiredargcmd") def test_call_command_required_args_cli(manage): - out = manage('requiredargcmd', ignore_errors=True) + out = manage("requiredargcmd", ignore_errors=True) out = out.replace(b"'", b'"') # may contain both single and double quotes assert out == ( - b'Usage: manage.py requiredargcmd [OPTIONS] ARG\n' - b'\n' + b"Usage: manage.py requiredargcmd [OPTIONS] ARG\n" + b"\n" b'Error: Missing argument "ARG".\n' ) def test_call_command_kwargs(): - call_command('testcmd', raise_when_called=False) + call_command("testcmd", raise_when_called=False) with pytest.raises(RuntimeError): - call_command('testcmd', raise_when_called=True) + call_command("testcmd", raise_when_called=True) def test_call_command_kwargs_rename(): - call_command('testcmd', **{'raise': False}) + call_command("testcmd", **{"raise": False}) with pytest.raises(RuntimeError): - call_command('testcmd', **{'raise': True}) + call_command("testcmd", **{"raise": True}) def test_call_directly(): @@ -100,78 +100,79 @@ def test_call_directly(): command(raise_when_called=True) with pytest.raises(RuntimeError): - command(**{'raise': True}) + command(**{"raise": True}) def test_django_verbosity(capsys, manage): # Make sure any command can be called, even if it does not explictly # accept the --verbosity option with pytest.raises(RuntimeError): - execute_from_command_line([ - './manage.py', 'testcmd', '--raise', '--verbosity', '1']) + execute_from_command_line( + ["./manage.py", "testcmd", "--raise", "--verbosity", "1"] + ) # Default - execute_from_command_line([ - './manage.py', 'ctxverbositycmd']) + execute_from_command_line(["./manage.py", "ctxverbositycmd"]) out, err = capsys.readouterr() - assert out == '1' + assert out == "1" # Explicit - execute_from_command_line([ - './manage.py', 'ctxverbositycmd', '--verbosity', '2']) + execute_from_command_line(["./manage.py", "ctxverbositycmd", "--verbosity", "2"]) out, err = capsys.readouterr() - assert out == '2' + assert out == "2" # Invalid - out = manage('ctxverbositycmd', '--verbosity', '4', ignore_errors=True) + out = manage("ctxverbositycmd", "--verbosity", "4", ignore_errors=True) out = out.replace(b"'", b'"') # may contain both single and double quotes assert out == ( - b'Usage: manage.py ctxverbositycmd [OPTIONS]\n' - b'\n' + b"Usage: manage.py ctxverbositycmd [OPTIONS]\n" + b"\n" b'Error: Invalid value for "-v" / "--verbosity": 4 is not in the ' - b'valid range of 0 to 3.\n' + b"valid range of 0 to 3.\n" ) # Default (option) - execute_from_command_line([ - './manage.py', 'argverbositycommand']) + execute_from_command_line(["./manage.py", "argverbositycommand"]) out, err = capsys.readouterr() - assert out == '1' + assert out == "1" # Explicit (option) - execute_from_command_line([ - './manage.py', 'argverbositycommand', '--verbosity', '2']) + execute_from_command_line( + ["./manage.py", "argverbositycommand", "--verbosity", "2"] + ) out, err = capsys.readouterr() - assert out == '2' + assert out == "2" def test_django_pythonpath(manage): with pytest.raises(subprocess.CalledProcessError): - manage('pathcmd') + manage("pathcmd") - manage('pathcmd', '--pythonpath', - os.path.join(os.path.dirname(__file__), 'testdir')) == b'1' + manage( + "pathcmd", "--pythonpath", os.path.join(os.path.dirname(__file__), "testdir") + ) == b"1" -@pytest.mark.xfail(reason="Looks like CommandError no longer " - "results in non-zero exit status") +@pytest.mark.xfail( + reason="Looks like CommandError no longer " "results in non-zero exit status" +) def test_django_traceback(manage): with pytest.raises(subprocess.CalledProcessError) as e: - manage('errcmd') - assert e.value.output == b'CommandError: Raised error description\n' + manage("errcmd") + assert e.value.output == b"CommandError: Raised error description\n" assert e.value.returncode == 1 with pytest.raises(subprocess.CalledProcessError) as e: - manage('errcmd', '--traceback') + manage("errcmd", "--traceback") e = e.value lines = e.output.splitlines() - assert lines[0] == b'Traceback (most recent call last):' + assert lines[0] == b"Traceback (most recent call last):" for line in lines[1:-1]: - assert line.startswith(b' ') + assert line.startswith(b" ") # Use `.endswith()` because of differences between CPython and pypy - assert lines[-1].endswith(b'CommandError: Raised error description') + assert lines[-1].endswith(b"CommandError: Raised error description") assert e.returncode == 1 @@ -179,30 +180,30 @@ def test_django_settings(manage): # The --settings switch only works from the command line (or if the django # settings where not setup before)... this means that we have to call it # in a subprocess. - cmd = 'settingscmd' - assert manage(cmd) == b'default' - assert manage(cmd, '--settings', 'testprj.settings') == b'default' - assert manage(cmd, '--settings', 'testprj.settings_alt') == b'alternative' + cmd = "settingscmd" + assert manage(cmd) == b"default" + assert manage(cmd, "--settings", "testprj.settings") == b"default" + assert manage(cmd, "--settings", "testprj.settings_alt") == b"alternative" def test_django_color(capsys): - call_command('colorcmd') + call_command("colorcmd") out, err = capsys.readouterr() # Not passing a --color/--no-color flag defaults to autodetection. As the # command is run through the test suite, the autodetection defaults to not # colorizing the output. - assert out == 'stdout' - assert err == 'stderr' + assert out == "stdout" + assert err == "stderr" - call_command('colorcmd', '--color') + call_command("colorcmd", "--color") out, err = capsys.readouterr() - assert out == click.style('stdout', fg='blue') - assert err == click.style('stderr', bg='red') + assert out == click.style("stdout", fg="blue") + assert err == click.style("stderr", bg="red") - call_command('colorcmd', '--no-color') + call_command("colorcmd", "--no-color") out, err = capsys.readouterr() - assert out == 'stdout' - assert err == 'stderr' + assert out == "stdout" + assert err == "stderr" def test_django_help(manage): @@ -210,43 +211,43 @@ def test_django_help(manage): # through execute_from_command_line would cause the test suite to exit as # well... this means that we have to call it in a subprocess. helps = [ - manage('helpcmd', '-h'), - manage('helpcmd', '--help'), - manage('help', 'helpcmd'), + manage("helpcmd", "-h"), + manage("helpcmd", "--help"), + manage("help", "helpcmd"), ] assert len(set(helps)) == 1 help_text = helps[0] - assert b'HELP_CALLED' not in help_text - assert help_text.startswith(b'Usage: manage.py helpcmd ') + assert b"HELP_CALLED" not in help_text + assert help_text.startswith(b"Usage: manage.py helpcmd ") def test_command_name_in_help(manage): # Doesn't matter which name, as long as we know it. - out = manage('helpcmd', '-h') - assert b'manage.py helpcmd [OPTIONS]' in out + out = manage("helpcmd", "-h") + assert b"manage.py helpcmd [OPTIONS]" in out def test_command_names_in_subcommand_help(manage): - out = manage('groupcmd', 'subcmd1', '-h') - assert b'manage.py groupcmd subcmd1' in out + out = manage("groupcmd", "subcmd1", "-h") + assert b"manage.py groupcmd subcmd1" in out def test_django_version(manage): - django_version = django.get_version().encode('ascii') + b'\n' - assert manage('testcmd', '--version') == django_version - assert manage('versioncmd', '--version') == b'20.0\n' + django_version = django.get_version().encode("ascii") + b"\n" + assert manage("testcmd", "--version") == django_version + assert manage("versioncmd", "--version") == b"20.0\n" def test_group_command(capsys): - execute_from_command_line(['./manage.py', 'groupcmd']) + execute_from_command_line(["./manage.py", "groupcmd"]) out, err = capsys.readouterr() - assert out == 'group_command\n' + assert out == "group_command\n" - execute_from_command_line(['./manage.py', 'groupcmd', 'subcmd1']) + execute_from_command_line(["./manage.py", "groupcmd", "subcmd1"]) out, err = capsys.readouterr() - assert out == 'group_command\nSUB1\n' + assert out == "group_command\nSUB1\n" - execute_from_command_line(['./manage.py', 'groupcmd', 'subcmd3']) + execute_from_command_line(["./manage.py", "groupcmd", "subcmd3"]) out, err = capsys.readouterr() - assert out == 'group_command\nSUB2\n' + assert out == "group_command\nSUB2\n" diff --git a/djclick/test/test_params.py b/djclick/test/test_params.py index dbf30db..2d2f922 100644 --- a/djclick/test/test_params.py +++ b/djclick/test/test_params.py @@ -19,35 +19,27 @@ def test_modelinstance_init(): @pytest.mark.django_db @pytest.mark.parametrize( - ('arg', 'value'), - ( - ('--pk', '1'), - ('--slug', 'test'), - ('--endswith', 'st'), - ) + ("arg", "value"), (("--pk", "1"), ("--slug", "test"), ("--endswith", "st"),) ) def test_convert_ok(call_command, arg, value): from testapp.models import DummyModel - DummyModel.objects.create(pk=1, slug='test') - expected = b'' + DummyModel.objects.create(pk=1, slug="test") + expected = b"" - assert call_command('modelcmd', arg, value).stdout == expected + assert call_command("modelcmd", arg, value).stdout == expected @pytest.mark.django_db @pytest.mark.parametrize( - ('args', 'error_message'), - ( - (('--pk', '99'), "pk=99"), - (('--slug', 'doesnotexist'), "slug=doesnotexist"), - ) + ("args", "error_message"), + ((("--pk", "99"), "pk=99"), (("--slug", "doesnotexist"), "slug=doesnotexist"),), ) def test_convert_fail(call_command, args, error_message): with pytest.raises(BadParameter) as e: - call_command('modelcmd', *args) + call_command("modelcmd", *args) # Use `.endswith()` because of differences between CPython and pypy assert e.type is BadParameter assert str(e.value).endswith( - 'could not find testapp.DummyModel with {}'.format( - error_message)) + "could not find testapp.DummyModel with {}".format(error_message) + ) diff --git a/djclick/test/testprj/testapp/management/commands/colorcmd.py b/djclick/test/testprj/testapp/management/commands/colorcmd.py index 643f3a5..a750919 100644 --- a/djclick/test/testprj/testapp/management/commands/colorcmd.py +++ b/djclick/test/testprj/testapp/management/commands/colorcmd.py @@ -3,5 +3,5 @@ @click.command() def command(): - click.secho('stdout', fg='blue', nl=False) - click.secho('stderr', bg='red', err=True, nl=False) + click.secho("stdout", fg="blue", nl=False) + click.secho("stderr", bg="red", err=True, nl=False) diff --git a/djclick/test/testprj/testapp/management/commands/errcmd.py b/djclick/test/testprj/testapp/management/commands/errcmd.py index ee0bd6a..2553e69 100644 --- a/djclick/test/testprj/testapp/management/commands/errcmd.py +++ b/djclick/test/testprj/testapp/management/commands/errcmd.py @@ -3,6 +3,6 @@ import djclick as click -@click.command(version='20.0') +@click.command(version="20.0") def command(): - raise CommandError('Raised error description') + raise CommandError("Raised error description") diff --git a/djclick/test/testprj/testapp/management/commands/groupcmd.py b/djclick/test/testprj/testapp/management/commands/groupcmd.py index 7e3b482..32b6d3f 100644 --- a/djclick/test/testprj/testapp/management/commands/groupcmd.py +++ b/djclick/test/testprj/testapp/management/commands/groupcmd.py @@ -3,14 +3,14 @@ @click.group(invoke_without_command=True) def main(): - click.echo('group_command') + click.echo("group_command") @main.command() def subcmd1(): - click.echo('SUB1') + click.echo("SUB1") -@main.command(name='subcmd3') +@main.command(name="subcmd3") def subcmd2(): - click.echo('SUB2') + click.echo("SUB2") diff --git a/djclick/test/testprj/testapp/management/commands/helpcmd.py b/djclick/test/testprj/testapp/management/commands/helpcmd.py index 0682d78..afa98c7 100644 --- a/djclick/test/testprj/testapp/management/commands/helpcmd.py +++ b/djclick/test/testprj/testapp/management/commands/helpcmd.py @@ -4,4 +4,4 @@ @click.command() def command(): # Just print some things which shall not be found in the output - click.echo('HELP_CALLED') # NOCOV + click.echo("HELP_CALLED") # NOCOV diff --git a/djclick/test/testprj/testapp/management/commands/modelcmd.py b/djclick/test/testprj/testapp/management/commands/modelcmd.py index cd5f4cb..c4eef05 100644 --- a/djclick/test/testprj/testapp/management/commands/modelcmd.py +++ b/djclick/test/testprj/testapp/management/commands/modelcmd.py @@ -5,10 +5,9 @@ @click.command() -@click.option('--pk', type=ModelInstance(DummyModel)) -@click.option('--slug', type=ModelInstance(DummyModel, lookup="slug")) -@click.option('--endswith', type=ModelInstance(DummyModel, - lookup="slug__endswith")) +@click.option("--pk", type=ModelInstance(DummyModel)) +@click.option("--slug", type=ModelInstance(DummyModel, lookup="slug")) +@click.option("--endswith", type=ModelInstance(DummyModel, lookup="slug__endswith")) def command(pk, slug, endswith): if pk: click.echo(repr(pk), nl=False) diff --git a/djclick/test/testprj/testapp/management/commands/requiredargcmd.py b/djclick/test/testprj/testapp/management/commands/requiredargcmd.py index 8cbc68a..9ccea5d 100644 --- a/djclick/test/testprj/testapp/management/commands/requiredargcmd.py +++ b/djclick/test/testprj/testapp/management/commands/requiredargcmd.py @@ -2,6 +2,6 @@ @click.command() -@click.argument('arg') +@click.argument("arg") def command(arg): click.echo(arg) diff --git a/djclick/test/testprj/testapp/management/commands/testcmd.py b/djclick/test/testprj/testapp/management/commands/testcmd.py index a436012..4b90b2a 100644 --- a/djclick/test/testprj/testapp/management/commands/testcmd.py +++ b/djclick/test/testprj/testapp/management/commands/testcmd.py @@ -2,7 +2,7 @@ @click.command() -@click.option('-r', '--raise', 'raise_when_called', is_flag=True) +@click.option("-r", "--raise", "raise_when_called", is_flag=True) def command(raise_when_called): if raise_when_called: raise RuntimeError() diff --git a/djclick/test/testprj/testapp/management/commands/versioncmd.py b/djclick/test/testprj/testapp/management/commands/versioncmd.py index 9d371b9..d3a8b3b 100644 --- a/djclick/test/testprj/testapp/management/commands/versioncmd.py +++ b/djclick/test/testprj/testapp/management/commands/versioncmd.py @@ -1,6 +1,6 @@ import djclick as click -@click.command(version='20.0') +@click.command(version="20.0") def command(): raise RuntimeError() # NOCOV diff --git a/djclick/test/testprj/testprj/settings.py b/djclick/test/testprj/testprj/settings.py index d8c1fb4..f5c8f5c 100644 --- a/djclick/test/testprj/testprj/settings.py +++ b/djclick/test/testprj/testprj/settings.py @@ -20,7 +20,7 @@ # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = '-hx##h6#&f$o*#gqjj^1s%fn@vmko69$8j*g=$icj3*l17$gi@' +SECRET_KEY = "-hx##h6#&f$o*#gqjj^1s%fn@vmko69$8j*g=$icj3*l17$gi@" # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True @@ -31,54 +31,54 @@ # Application definition INSTALLED_APPS = ( - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'testapp', + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + "testapp", ) MIDDLEWARE_CLASSES = ( - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'django.middleware.security.SecurityMiddleware', + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.auth.middleware.SessionAuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", + "django.middleware.security.SecurityMiddleware", ) -ROOT_URLCONF = 'testprj.urls' +ROOT_URLCONF = "testprj.urls" TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", ], }, }, ] -WSGI_APPLICATION = 'testprj.wsgi.application' +WSGI_APPLICATION = "testprj.wsgi.application" # Database # https://docs.djangoproject.com/en/1.8/ref/settings/#databases DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": os.path.join(BASE_DIR, "db.sqlite3"), } } @@ -86,9 +86,9 @@ # Internationalization # https://docs.djangoproject.com/en/1.8/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = "en-us" -TIME_ZONE = 'UTC' +TIME_ZONE = "UTC" USE_I18N = True @@ -100,6 +100,6 @@ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.8/howto/static-files/ -STATIC_URL = '/static/' +STATIC_URL = "/static/" -SETTINGS_NAME = 'default' +SETTINGS_NAME = "default" diff --git a/djclick/test/testprj/testprj/settings_alt.py b/djclick/test/testprj/testprj/settings_alt.py index a4c1483..c2955b3 100644 --- a/djclick/test/testprj/testprj/settings_alt.py +++ b/djclick/test/testprj/testprj/settings_alt.py @@ -1,3 +1,3 @@ from .settings import * # NOQA -SETTINGS_NAME = 'alternative' +SETTINGS_NAME = "alternative" diff --git a/djclick/test/testprj/testprj/urls.py b/djclick/test/testprj/testprj/urls.py index 7002397..9cf0362 100644 --- a/djclick/test/testprj/testprj/urls.py +++ b/djclick/test/testprj/testprj/urls.py @@ -17,5 +17,5 @@ from django.contrib import admin urlpatterns = [ - url(r'^admin/', include(admin.site.urls)), + url(r"^admin/", include(admin.site.urls)), ] diff --git a/setup.py b/setup.py index 75319e2..483c9ee 100755 --- a/setup.py +++ b/setup.py @@ -9,24 +9,24 @@ from setuptools import setup, find_packages -PACKAGE = 'djclick' -PACKAGE_NAME = 'django-click' -DESCRIPTION = 'Write Django management command using the click CLI library' +PACKAGE = "djclick" +PACKAGE_NAME = "django-click" +DESCRIPTION = "Write Django management command using the click CLI library" CLASSIFIERS = [ - 'Development Status :: 4 - Beta', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: MIT License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.3', - 'Programming Language :: Python :: 3.4', + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.3", + "Programming Language :: Python :: 3.4", ] -if sys.argv[-1] == 'publish': - os.system('python setup.py sdist bdist_wheel upload') +if sys.argv[-1] == "publish": + os.system("python setup.py sdist bdist_wheel upload") sys.exit() @@ -39,12 +39,12 @@ def read(fname, fail_silently=False): """ try: filepath = os.path.join(os.path.dirname(__file__), fname) - with io.open(filepath, 'rt', encoding='utf8') as f: + with io.open(filepath, "rt", encoding="utf8") as f: return f.read() except: if not fail_silently: raise - return '' + return "" @staticmethod def requirements(fname): @@ -52,20 +52,20 @@ def requirements(fname): Create a list of requirements from the output of the pip freeze command saved in a text file. """ - packages = Setup.read(fname, fail_silently=True).split('\n') + packages = Setup.read(fname, fail_silently=True).split("\n") packages = (p.strip() for p in packages) - packages = (p for p in packages if p and not p.startswith('#')) - packages = (p for p in packages if p and not p.startswith('https://')) - packages = (p for p in packages if p and not p.startswith('-r ')) + packages = (p for p in packages if p and not p.startswith("#")) + packages = (p for p in packages if p and not p.startswith("https://")) + packages = (p for p in packages if p and not p.startswith("-r ")) return list(packages) @classmethod def extra_requirements(cls, glob_pattern): - before, after = glob_pattern.split('*', 1) + before, after = glob_pattern.split("*", 1) pattern = os.path.join(os.path.dirname(__file__), glob_pattern) requirements = {} for path in glob.glob(pattern): - name = path[len(before):-len(after)] + name = path[len(before) : -len(after)] requirements[name] = cls.requirements(path) return requirements @@ -75,8 +75,8 @@ def get_files(*bases): List all files in a data directory. """ for base in bases: - basedir, _ = base.split('.', 1) - base = os.path.join(os.path.dirname(__file__), *base.split('.')) + basedir, _ = base.split(".", 1) + base = os.path.join(os.path.dirname(__file__), *base.split(".")) rem = len(os.path.dirname(base)) + len(basedir) + 2 @@ -86,41 +86,42 @@ def get_files(*bases): @staticmethod def get_metavar(name): - data = Setup.read(os.path.join(PACKAGE, '__init__.py')) - value = (re.search(u"__{}__\s*=\s*u?'([^']+)'".format(name), data) - .group(1).strip()) + data = Setup.read(os.path.join(PACKAGE, "__init__.py")) + value = ( + re.search(u"__{}__\s*=\s*u?'([^']+)'".format(name), data).group(1).strip() + ) return value @classmethod def version(cls): - return cls.get_metavar('version') + return cls.get_metavar("version") @classmethod def url(cls): - return cls.get_metavar('url') + return cls.get_metavar("url") @classmethod def author(cls): - return cls.get_metavar('author') + return cls.get_metavar("author") @classmethod def email(cls): - return cls.get_metavar('email') + return cls.get_metavar("email") @classmethod def license(cls): - return cls.get_metavar('license') + return cls.get_metavar("license") @staticmethod def longdesc(): - return Setup.read('README.rst') + '\n\n' + Setup.read('HISTORY.rst') + return Setup.read("README.rst") + "\n\n" + Setup.read("HISTORY.rst") @staticmethod def test_links(): # Test if hardlinks work. This is a workaround until # http://bugs.python.org/issue8876 is solved - if hasattr(os, 'link'): - tempfile = __file__ + '.tmp' + if hasattr(os, "link"): + tempfile = __file__ + ".tmp" try: os.link(__file__, tempfile) except OSError as e: @@ -135,19 +136,21 @@ def test_links(): Setup.test_links() -setup(name=PACKAGE_NAME, - version=Setup.version(), - author=Setup.author(), - author_email=Setup.email(), - include_package_data=True, - zip_safe=False, - url=Setup.url(), - license=Setup.license(), - packages=find_packages(), - package_dir={PACKAGE: PACKAGE}, - description=DESCRIPTION, - install_requires=Setup.requirements('requirements.txt'), - extras_require=Setup.extra_requirements('requirements-*.txt'), - long_description=Setup.longdesc(), - entry_points=Setup.read('entry-points.ini', True), - classifiers=CLASSIFIERS) +setup( + name=PACKAGE_NAME, + version=Setup.version(), + author=Setup.author(), + author_email=Setup.email(), + include_package_data=True, + zip_safe=False, + url=Setup.url(), + license=Setup.license(), + packages=find_packages(), + package_dir={PACKAGE: PACKAGE}, + description=DESCRIPTION, + install_requires=Setup.requirements("requirements.txt"), + extras_require=Setup.extra_requirements("requirements-*.txt"), + long_description=Setup.longdesc(), + entry_points=Setup.read("entry-points.ini", True), + classifiers=CLASSIFIERS, +) From b58e64a8fa143b0e667cdad8c984d63fa6c65e75 Mon Sep 17 00:00:00 2001 From: "Allen, Timothy" Date: Fri, 12 Jun 2020 21:10:29 -0400 Subject: [PATCH 3/4] Paint it Black. --- djclick/__init__.py | 4 +- djclick/adapter.py | 105 ++++++----- djclick/params.py | 12 +- djclick/test/conftest.py | 6 +- djclick/test/test_adapter.py | 163 +++++++++--------- djclick/test/test_params.py | 26 +-- .../testapp/management/commands/colorcmd.py | 4 +- .../testapp/management/commands/errcmd.py | 4 +- .../testapp/management/commands/groupcmd.py | 8 +- .../testapp/management/commands/helpcmd.py | 2 +- .../testapp/management/commands/modelcmd.py | 7 +- .../management/commands/requiredargcmd.py | 2 +- .../testapp/management/commands/testcmd.py | 2 +- .../testapp/management/commands/versioncmd.py | 2 +- djclick/test/testprj/testprj/settings.py | 68 ++++---- djclick/test/testprj/testprj/settings_alt.py | 2 +- djclick/test/testprj/testprj/urls.py | 2 +- setup.py | 106 ++++++------ 18 files changed, 272 insertions(+), 253 deletions(-) diff --git a/djclick/__init__.py b/djclick/__init__.py index 1c0a885..b9bd068 100644 --- a/djclick/__init__.py +++ b/djclick/__init__.py @@ -8,11 +8,13 @@ from .adapter import GroupRegistrator as group, pass_verbosity # NOQA +# The RegEx in setup.py requires single quotes. Rather than change it, turn off Black. +# fmt: off __version__ = '2.2.0' __url__ = 'https://github.com/GaretJax/django-click' __author__ = 'Jonathan Stoppani' __email__ = 'jonathan@stoppani.name' __license__ = 'MIT' - +# fmt: on del click diff --git a/djclick/adapter.py b/djclick/adapter.py index 8cc6147..1233a15 100644 --- a/djclick/adapter.py +++ b/djclick/adapter.py @@ -12,6 +12,7 @@ class OptionParseAdapter(object): """Django pre-1.10-compatible adapter, deprecated""" + def parse_args(self, args): return (self, None) # NOCOV @@ -22,7 +23,7 @@ def __init__(self, args): def _get_kwargs(self): return { - 'args': self._args, + "args": self._args, } @@ -43,8 +44,7 @@ class DjangoCommandMixin(object): @property def stealth_options(self): return sum( - ([p.name] + [i.lstrip('-') for i in p.opts] for p in self.params), - [], + ([p.name] + [i.lstrip("-") for i in p.opts] for p in self.params), [], ) def invoke(self, ctx): @@ -54,7 +54,9 @@ def invoke(self, ctx): # Honor the --traceback flag if ctx.traceback: # NOCOV raise - styled_message = click.style('{}: {}'.format(e.__class__.__name__, e), fg='red', bold=True) + styled_message = click.style( + "{}: {}".format(e.__class__.__name__, e), fg="red", bold=True + ) click.echo(styled_message, err=True) ctx.exit(1) @@ -62,14 +64,16 @@ def run_from_argv(self, argv): """ Called when run from the command line. """ - prog_name = '{} {}'.format(os.path.basename(argv[0]), argv[1]) + prog_name = "{} {}".format(os.path.basename(argv[0]), argv[1]) try: # We won't get an exception here in standalone_mode=False - exit_code = self.main(args=argv[2:], prog_name=prog_name, standalone_mode=False) + exit_code = self.main( + args=argv[2:], prog_name=prog_name, standalone_mode=False + ) if exit_code: sys.exit(exit_code) except click.ClickException as e: - if getattr(e.ctx, 'traceback', False): # NOCOV + if getattr(e.ctx, "traceback", False): # NOCOV raise e.show() sys.exit(e.exit_code) @@ -84,13 +88,13 @@ def create_parser(self, progname, subcommand): return OptionParseAdapter() def print_help(self, prog_name, subcommand): - prog_name = '{} {}'.format(prog_name, subcommand) - self.main(['--help'], prog_name=prog_name, standalone_mode=False) + prog_name = "{} {}".format(prog_name, subcommand) + self.main(["--help"], prog_name=prog_name, standalone_mode=False) def map_names(self): for param in self.params: for opt in param.opts: - yield opt.lstrip('--').replace('-', '_'), param.name + yield opt.lstrip("--").replace("-", "_"), param.name def execute(self, *args, **kwargs): """ @@ -100,13 +104,14 @@ def execute(self, *args, **kwargs): `call_command`. """ # Remove internal Django command handling machinery - kwargs.pop('skip_checks', None) + kwargs.pop("skip_checks", None) parent_ctx = click.get_current_context(silent=True) - with self.make_context('', list(args), parent=parent_ctx) as ctx: + with self.make_context("", list(args), parent=parent_ctx) as ctx: # Rename kwargs to to the appropriate destination argument name opt_mapping = dict(self.map_names()) - arg_options = {opt_mapping.get(key, key): value - for key, value in six.iteritems(kwargs)} + arg_options = { + opt_mapping.get(key, key): value for key, value in six.iteritems(kwargs) + } # Update the context with the passed (renamed) kwargs ctx.params.update(arg_options) @@ -150,53 +155,63 @@ def suppress_colors(ctx, param, value): class BaseRegistrator(object): common_options = [ click.option( - '-v', '--verbosity', + "-v", + "--verbosity", expose_value=False, - default='1', + default="1", callback=register_on_context, type=click.IntRange(min=0, max=3), - help=('Verbosity level; 0=minimal output, 1=normal ''output, ' - '2=verbose output, 3=very verbose output.'), + help=( + "Verbosity level; 0=minimal output, 1=normal " + "output, " + "2=verbose output, 3=very verbose output." + ), ), click.option( - '--settings', - metavar='SETTINGS', + "--settings", + metavar="SETTINGS", expose_value=False, - help=('The Python path to a settings module, e.g. ' - '"myproject.settings.main". If this is not provided, the ' - 'DJANGO_SETTINGS_MODULE environment variable will be used.'), + help=( + "The Python path to a settings module, e.g. " + '"myproject.settings.main". If this is not provided, the ' + "DJANGO_SETTINGS_MODULE environment variable will be used." + ), ), click.option( - '--pythonpath', - metavar='PYTHONPATH', + "--pythonpath", + metavar="PYTHONPATH", expose_value=False, - help=('A directory to add to the Python path, e.g. ' - '"/home/djangoprojects/myproject".'), + help=( + "A directory to add to the Python path, e.g. " + '"/home/djangoprojects/myproject".' + ), ), click.option( - '--traceback/--no-traceback', + "--traceback/--no-traceback", is_flag=True, default=False, expose_value=False, callback=register_on_context, - help='Raise on CommandError exceptions.', + help="Raise on CommandError exceptions.", ), click.option( - '--color/--no-color', + "--color/--no-color", default=None, expose_value=False, callback=suppress_colors, - help=('Enable or disable output colorization. Default is to ' - 'autodetect the best behavior.'), + help=( + "Enable or disable output colorization. Default is to " + "autodetect the best behavior." + ), ), ] def __init__(self, **kwargs): self.kwargs = kwargs - self.version = self.kwargs.pop('version', get_version()) + self.version = self.kwargs.pop("version", get_version()) - context_settings = kwargs.setdefault('context_settings', {}) - context_settings['help_option_names'] = ['-h', '--help'] + context_settings = kwargs.setdefault("context_settings", {}) + context_settings["help_option_names"] = ["-h", "--help"] def get_params(self, name): def show_help(ctx, param, value): @@ -205,17 +220,23 @@ def show_help(ctx, param, value): ctx.exit() return [ - click.version_option(version=self.version, message='%(version)s'), - click.option('-h', '--help', is_flag=True, is_eager=True, - expose_value=False, callback=show_help, - help='Show this message and exit.',), + click.version_option(version=self.version, message="%(version)s"), + click.option( + "-h", + "--help", + is_flag=True, + is_eager=True, + expose_value=False, + callback=show_help, + help="Show this message and exit.", + ), ] + self.common_options def __call__(self, func): module = sys.modules[func.__module__] # Get the command name as Django expects it - self.name = func.__module__.rsplit('.', 1)[-1] + self.name = func.__module__.rsplit(".", 1)[-1] # Build the click command decorators = [ @@ -237,9 +258,11 @@ def pass_verbosity(f): """ Marks a callback as wanting to receive the verbosity as a keyword argument. """ + def new_func(*args, **kwargs): - kwargs['verbosity'] = click.get_current_context().verbosity + kwargs["verbosity"] = click.get_current_context().verbosity return f(*args, **kwargs) + return update_wrapper(new_func, f) diff --git a/djclick/params.py b/djclick/params.py index 75c9da5..5062731 100644 --- a/djclick/params.py +++ b/djclick/params.py @@ -4,16 +4,13 @@ class ModelInstance(click.ParamType): - def __init__(self, qs, lookup='pk'): + def __init__(self, qs, lookup="pk"): from django.db import models if isinstance(qs, type) and issubclass(qs, models.Model): qs = qs.objects.all() self.qs = qs - self.name = '{}.{}'.format( - qs.model._meta.app_label, - qs.model.__name__, - ) + self.name = "{}.{}".format(qs.model._meta.app_label, qs.model.__name__,) self.lookup = lookup def convert(self, value, param, ctx): @@ -25,6 +22,7 @@ def convert(self, value, param, ctx): pass # call `fail` outside of exception context to avoid nested exception # handling on Python 3 - msg = 'could not find {s.name} with {s.lookup}={value}'.format( - s=self, value=value) + msg = "could not find {s.name} with {s.lookup}={value}".format( + s=self, value=value + ) self.fail(msg, param, ctx) diff --git a/djclick/test/conftest.py b/djclick/test/conftest.py index b89f979..3a83f90 100644 --- a/djclick/test/conftest.py +++ b/djclick/test/conftest.py @@ -6,14 +6,14 @@ import pytest -@pytest.fixture(scope='session') +@pytest.fixture(scope="session") def manage(): def call(*args, **kwargs): - ignore_errors = kwargs.pop('ignore_errors', False) + ignore_errors = kwargs.pop("ignore_errors", False) assert not kwargs cmd = [ sys.executable, - os.path.join(os.path.dirname(__file__), 'testprj', 'manage.py'), + os.path.join(os.path.dirname(__file__), "testprj", "manage.py"), ] + list(args) try: return subprocess.check_output(cmd, stderr=subprocess.STDOUT) diff --git a/djclick/test/test_adapter.py b/djclick/test/test_adapter.py index d66bfd0..cc35f49 100644 --- a/djclick/test/test_adapter.py +++ b/djclick/test/test_adapter.py @@ -16,10 +16,10 @@ import djclick -todo = pytest.mark.xfail(reason='TODO') +todo = pytest.mark.xfail(reason="TODO") -@pytest.mark.skipif(not six.PY3, reason='Only necessary on Python3') +@pytest.mark.skipif(not six.PY3, reason="Only necessary on Python3") def test_not_ascii(): # NOCOV """ Make sure that the systems preferred encoding is not `ascii`. @@ -35,60 +35,60 @@ def test_not_ascii(): # NOCOV preferred_encoding = locale.getpreferredencoding() fs_enc = codecs.lookup(preferred_encoding).name except Exception: - fs_enc = 'ascii' - assert fs_enc != 'ascii' + fs_enc = "ascii" + assert fs_enc != "ascii" def test_attributes(): for attr in dir(click): - if not attr.startswith('_'): + if not attr.startswith("_"): assert hasattr(djclick, attr) def test_command_recognized(): - assert 'testcmd' in get_commands() + assert "testcmd" in get_commands() def test_call_cli(): - execute_from_command_line(['./manage.py', 'testcmd']) + execute_from_command_line(["./manage.py", "testcmd"]) with pytest.raises(RuntimeError): - execute_from_command_line(['./manage.py', 'testcmd', '--raise']) + execute_from_command_line(["./manage.py", "testcmd", "--raise"]) def test_call_command_args(): - call_command('testcmd') + call_command("testcmd") with pytest.raises(RuntimeError): - call_command('testcmd', '-r') + call_command("testcmd", "-r") with pytest.raises(RuntimeError): - call_command('testcmd', '--raise') + call_command("testcmd", "--raise") def test_call_command_required_args(): - call_command('requiredargcmd', 'arg1') + call_command("requiredargcmd", "arg1") with pytest.raises(click.MissingParameter): - call_command('requiredargcmd') + call_command("requiredargcmd") def test_call_command_required_args_cli(manage): - out = manage('requiredargcmd', ignore_errors=True) + out = manage("requiredargcmd", ignore_errors=True) out = out.replace(b"'", b'"') # may contain both single and double quotes assert out == ( - b'Usage: manage.py requiredargcmd [OPTIONS] ARG\n' - b'\n' + b"Usage: manage.py requiredargcmd [OPTIONS] ARG\n" + b"\n" b'Error: Missing argument "ARG".\n' ) def test_call_command_kwargs(): - call_command('testcmd', raise_when_called=False) + call_command("testcmd", raise_when_called=False) with pytest.raises(RuntimeError): - call_command('testcmd', raise_when_called=True) + call_command("testcmd", raise_when_called=True) def test_call_command_kwargs_rename(): - call_command('testcmd', **{'raise': False}) + call_command("testcmd", **{"raise": False}) with pytest.raises(RuntimeError): - call_command('testcmd', **{'raise': True}) + call_command("testcmd", **{"raise": True}) def test_call_directly(): @@ -100,78 +100,79 @@ def test_call_directly(): command(raise_when_called=True) with pytest.raises(RuntimeError): - command(**{'raise': True}) + command(**{"raise": True}) def test_django_verbosity(capsys, manage): # Make sure any command can be called, even if it does not explictly # accept the --verbosity option with pytest.raises(RuntimeError): - execute_from_command_line([ - './manage.py', 'testcmd', '--raise', '--verbosity', '1']) + execute_from_command_line( + ["./manage.py", "testcmd", "--raise", "--verbosity", "1"] + ) # Default - execute_from_command_line([ - './manage.py', 'ctxverbositycmd']) + execute_from_command_line(["./manage.py", "ctxverbositycmd"]) out, err = capsys.readouterr() - assert out == '1' + assert out == "1" # Explicit - execute_from_command_line([ - './manage.py', 'ctxverbositycmd', '--verbosity', '2']) + execute_from_command_line(["./manage.py", "ctxverbositycmd", "--verbosity", "2"]) out, err = capsys.readouterr() - assert out == '2' + assert out == "2" # Invalid - out = manage('ctxverbositycmd', '--verbosity', '4', ignore_errors=True) + out = manage("ctxverbositycmd", "--verbosity", "4", ignore_errors=True) out = out.replace(b"'", b'"') # may contain both single and double quotes assert out == ( - b'Usage: manage.py ctxverbositycmd [OPTIONS]\n' - b'\n' + b"Usage: manage.py ctxverbositycmd [OPTIONS]\n" + b"\n" b'Error: Invalid value for "-v" / "--verbosity": 4 is not in the ' - b'valid range of 0 to 3.\n' + b"valid range of 0 to 3.\n" ) # Default (option) - execute_from_command_line([ - './manage.py', 'argverbositycommand']) + execute_from_command_line(["./manage.py", "argverbositycommand"]) out, err = capsys.readouterr() - assert out == '1' + assert out == "1" # Explicit (option) - execute_from_command_line([ - './manage.py', 'argverbositycommand', '--verbosity', '2']) + execute_from_command_line( + ["./manage.py", "argverbositycommand", "--verbosity", "2"] + ) out, err = capsys.readouterr() - assert out == '2' + assert out == "2" def test_django_pythonpath(manage): with pytest.raises(subprocess.CalledProcessError): - manage('pathcmd') + manage("pathcmd") - manage('pathcmd', '--pythonpath', - os.path.join(os.path.dirname(__file__), 'testdir')) == b'1' + manage( + "pathcmd", "--pythonpath", os.path.join(os.path.dirname(__file__), "testdir") + ) == b"1" -@pytest.mark.xfail(reason="Looks like CommandError no longer " - "results in non-zero exit status") +@pytest.mark.xfail( + reason="Looks like CommandError no longer " "results in non-zero exit status" +) def test_django_traceback(manage): with pytest.raises(subprocess.CalledProcessError) as e: - manage('errcmd') - assert e.value.output == b'CommandError: Raised error description\n' + manage("errcmd") + assert e.value.output == b"CommandError: Raised error description\n" assert e.value.returncode == 1 with pytest.raises(subprocess.CalledProcessError) as e: - manage('errcmd', '--traceback') + manage("errcmd", "--traceback") e = e.value lines = e.output.splitlines() - assert lines[0] == b'Traceback (most recent call last):' + assert lines[0] == b"Traceback (most recent call last):" for line in lines[1:-1]: - assert line.startswith(b' ') + assert line.startswith(b" ") # Use `.endswith()` because of differences between CPython and pypy - assert lines[-1].endswith(b'CommandError: Raised error description') + assert lines[-1].endswith(b"CommandError: Raised error description") assert e.returncode == 1 @@ -179,30 +180,30 @@ def test_django_settings(manage): # The --settings switch only works from the command line (or if the django # settings where not setup before)... this means that we have to call it # in a subprocess. - cmd = 'settingscmd' - assert manage(cmd) == b'default' - assert manage(cmd, '--settings', 'testprj.settings') == b'default' - assert manage(cmd, '--settings', 'testprj.settings_alt') == b'alternative' + cmd = "settingscmd" + assert manage(cmd) == b"default" + assert manage(cmd, "--settings", "testprj.settings") == b"default" + assert manage(cmd, "--settings", "testprj.settings_alt") == b"alternative" def test_django_color(capsys): - call_command('colorcmd') + call_command("colorcmd") out, err = capsys.readouterr() # Not passing a --color/--no-color flag defaults to autodetection. As the # command is run through the test suite, the autodetection defaults to not # colorizing the output. - assert out == 'stdout' - assert err == 'stderr' + assert out == "stdout" + assert err == "stderr" - call_command('colorcmd', '--color') + call_command("colorcmd", "--color") out, err = capsys.readouterr() - assert out == click.style('stdout', fg='blue') - assert err == click.style('stderr', bg='red') + assert out == click.style("stdout", fg="blue") + assert err == click.style("stderr", bg="red") - call_command('colorcmd', '--no-color') + call_command("colorcmd", "--no-color") out, err = capsys.readouterr() - assert out == 'stdout' - assert err == 'stderr' + assert out == "stdout" + assert err == "stderr" def test_django_help(manage): @@ -210,43 +211,43 @@ def test_django_help(manage): # through execute_from_command_line would cause the test suite to exit as # well... this means that we have to call it in a subprocess. helps = [ - manage('helpcmd', '-h'), - manage('helpcmd', '--help'), - manage('help', 'helpcmd'), + manage("helpcmd", "-h"), + manage("helpcmd", "--help"), + manage("help", "helpcmd"), ] assert len(set(helps)) == 1 help_text = helps[0] - assert b'HELP_CALLED' not in help_text - assert help_text.startswith(b'Usage: manage.py helpcmd ') + assert b"HELP_CALLED" not in help_text + assert help_text.startswith(b"Usage: manage.py helpcmd ") def test_command_name_in_help(manage): # Doesn't matter which name, as long as we know it. - out = manage('helpcmd', '-h') - assert b'manage.py helpcmd [OPTIONS]' in out + out = manage("helpcmd", "-h") + assert b"manage.py helpcmd [OPTIONS]" in out def test_command_names_in_subcommand_help(manage): - out = manage('groupcmd', 'subcmd1', '-h') - assert b'manage.py groupcmd subcmd1' in out + out = manage("groupcmd", "subcmd1", "-h") + assert b"manage.py groupcmd subcmd1" in out def test_django_version(manage): - django_version = django.get_version().encode('ascii') + b'\n' - assert manage('testcmd', '--version') == django_version - assert manage('versioncmd', '--version') == b'20.0\n' + django_version = django.get_version().encode("ascii") + b"\n" + assert manage("testcmd", "--version") == django_version + assert manage("versioncmd", "--version") == b"20.0\n" def test_group_command(capsys): - execute_from_command_line(['./manage.py', 'groupcmd']) + execute_from_command_line(["./manage.py", "groupcmd"]) out, err = capsys.readouterr() - assert out == 'group_command\n' + assert out == "group_command\n" - execute_from_command_line(['./manage.py', 'groupcmd', 'subcmd1']) + execute_from_command_line(["./manage.py", "groupcmd", "subcmd1"]) out, err = capsys.readouterr() - assert out == 'group_command\nSUB1\n' + assert out == "group_command\nSUB1\n" - execute_from_command_line(['./manage.py', 'groupcmd', 'subcmd3']) + execute_from_command_line(["./manage.py", "groupcmd", "subcmd3"]) out, err = capsys.readouterr() - assert out == 'group_command\nSUB2\n' + assert out == "group_command\nSUB2\n" diff --git a/djclick/test/test_params.py b/djclick/test/test_params.py index dbf30db..2d2f922 100644 --- a/djclick/test/test_params.py +++ b/djclick/test/test_params.py @@ -19,35 +19,27 @@ def test_modelinstance_init(): @pytest.mark.django_db @pytest.mark.parametrize( - ('arg', 'value'), - ( - ('--pk', '1'), - ('--slug', 'test'), - ('--endswith', 'st'), - ) + ("arg", "value"), (("--pk", "1"), ("--slug", "test"), ("--endswith", "st"),) ) def test_convert_ok(call_command, arg, value): from testapp.models import DummyModel - DummyModel.objects.create(pk=1, slug='test') - expected = b'' + DummyModel.objects.create(pk=1, slug="test") + expected = b"" - assert call_command('modelcmd', arg, value).stdout == expected + assert call_command("modelcmd", arg, value).stdout == expected @pytest.mark.django_db @pytest.mark.parametrize( - ('args', 'error_message'), - ( - (('--pk', '99'), "pk=99"), - (('--slug', 'doesnotexist'), "slug=doesnotexist"), - ) + ("args", "error_message"), + ((("--pk", "99"), "pk=99"), (("--slug", "doesnotexist"), "slug=doesnotexist"),), ) def test_convert_fail(call_command, args, error_message): with pytest.raises(BadParameter) as e: - call_command('modelcmd', *args) + call_command("modelcmd", *args) # Use `.endswith()` because of differences between CPython and pypy assert e.type is BadParameter assert str(e.value).endswith( - 'could not find testapp.DummyModel with {}'.format( - error_message)) + "could not find testapp.DummyModel with {}".format(error_message) + ) diff --git a/djclick/test/testprj/testapp/management/commands/colorcmd.py b/djclick/test/testprj/testapp/management/commands/colorcmd.py index 643f3a5..a750919 100644 --- a/djclick/test/testprj/testapp/management/commands/colorcmd.py +++ b/djclick/test/testprj/testapp/management/commands/colorcmd.py @@ -3,5 +3,5 @@ @click.command() def command(): - click.secho('stdout', fg='blue', nl=False) - click.secho('stderr', bg='red', err=True, nl=False) + click.secho("stdout", fg="blue", nl=False) + click.secho("stderr", bg="red", err=True, nl=False) diff --git a/djclick/test/testprj/testapp/management/commands/errcmd.py b/djclick/test/testprj/testapp/management/commands/errcmd.py index ee0bd6a..2553e69 100644 --- a/djclick/test/testprj/testapp/management/commands/errcmd.py +++ b/djclick/test/testprj/testapp/management/commands/errcmd.py @@ -3,6 +3,6 @@ import djclick as click -@click.command(version='20.0') +@click.command(version="20.0") def command(): - raise CommandError('Raised error description') + raise CommandError("Raised error description") diff --git a/djclick/test/testprj/testapp/management/commands/groupcmd.py b/djclick/test/testprj/testapp/management/commands/groupcmd.py index 7e3b482..32b6d3f 100644 --- a/djclick/test/testprj/testapp/management/commands/groupcmd.py +++ b/djclick/test/testprj/testapp/management/commands/groupcmd.py @@ -3,14 +3,14 @@ @click.group(invoke_without_command=True) def main(): - click.echo('group_command') + click.echo("group_command") @main.command() def subcmd1(): - click.echo('SUB1') + click.echo("SUB1") -@main.command(name='subcmd3') +@main.command(name="subcmd3") def subcmd2(): - click.echo('SUB2') + click.echo("SUB2") diff --git a/djclick/test/testprj/testapp/management/commands/helpcmd.py b/djclick/test/testprj/testapp/management/commands/helpcmd.py index 0682d78..afa98c7 100644 --- a/djclick/test/testprj/testapp/management/commands/helpcmd.py +++ b/djclick/test/testprj/testapp/management/commands/helpcmd.py @@ -4,4 +4,4 @@ @click.command() def command(): # Just print some things which shall not be found in the output - click.echo('HELP_CALLED') # NOCOV + click.echo("HELP_CALLED") # NOCOV diff --git a/djclick/test/testprj/testapp/management/commands/modelcmd.py b/djclick/test/testprj/testapp/management/commands/modelcmd.py index cd5f4cb..c4eef05 100644 --- a/djclick/test/testprj/testapp/management/commands/modelcmd.py +++ b/djclick/test/testprj/testapp/management/commands/modelcmd.py @@ -5,10 +5,9 @@ @click.command() -@click.option('--pk', type=ModelInstance(DummyModel)) -@click.option('--slug', type=ModelInstance(DummyModel, lookup="slug")) -@click.option('--endswith', type=ModelInstance(DummyModel, - lookup="slug__endswith")) +@click.option("--pk", type=ModelInstance(DummyModel)) +@click.option("--slug", type=ModelInstance(DummyModel, lookup="slug")) +@click.option("--endswith", type=ModelInstance(DummyModel, lookup="slug__endswith")) def command(pk, slug, endswith): if pk: click.echo(repr(pk), nl=False) diff --git a/djclick/test/testprj/testapp/management/commands/requiredargcmd.py b/djclick/test/testprj/testapp/management/commands/requiredargcmd.py index 8cbc68a..9ccea5d 100644 --- a/djclick/test/testprj/testapp/management/commands/requiredargcmd.py +++ b/djclick/test/testprj/testapp/management/commands/requiredargcmd.py @@ -2,6 +2,6 @@ @click.command() -@click.argument('arg') +@click.argument("arg") def command(arg): click.echo(arg) diff --git a/djclick/test/testprj/testapp/management/commands/testcmd.py b/djclick/test/testprj/testapp/management/commands/testcmd.py index a436012..4b90b2a 100644 --- a/djclick/test/testprj/testapp/management/commands/testcmd.py +++ b/djclick/test/testprj/testapp/management/commands/testcmd.py @@ -2,7 +2,7 @@ @click.command() -@click.option('-r', '--raise', 'raise_when_called', is_flag=True) +@click.option("-r", "--raise", "raise_when_called", is_flag=True) def command(raise_when_called): if raise_when_called: raise RuntimeError() diff --git a/djclick/test/testprj/testapp/management/commands/versioncmd.py b/djclick/test/testprj/testapp/management/commands/versioncmd.py index 9d371b9..d3a8b3b 100644 --- a/djclick/test/testprj/testapp/management/commands/versioncmd.py +++ b/djclick/test/testprj/testapp/management/commands/versioncmd.py @@ -1,6 +1,6 @@ import djclick as click -@click.command(version='20.0') +@click.command(version="20.0") def command(): raise RuntimeError() # NOCOV diff --git a/djclick/test/testprj/testprj/settings.py b/djclick/test/testprj/testprj/settings.py index d8c1fb4..f5c8f5c 100644 --- a/djclick/test/testprj/testprj/settings.py +++ b/djclick/test/testprj/testprj/settings.py @@ -20,7 +20,7 @@ # See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = '-hx##h6#&f$o*#gqjj^1s%fn@vmko69$8j*g=$icj3*l17$gi@' +SECRET_KEY = "-hx##h6#&f$o*#gqjj^1s%fn@vmko69$8j*g=$icj3*l17$gi@" # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True @@ -31,54 +31,54 @@ # Application definition INSTALLED_APPS = ( - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'testapp', + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + "testapp", ) MIDDLEWARE_CLASSES = ( - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - 'django.middleware.security.SecurityMiddleware', + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.auth.middleware.SessionAuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", + "django.middleware.security.SecurityMiddleware", ) -ROOT_URLCONF = 'testprj.urls' +ROOT_URLCONF = "testprj.urls" TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", ], }, }, ] -WSGI_APPLICATION = 'testprj.wsgi.application' +WSGI_APPLICATION = "testprj.wsgi.application" # Database # https://docs.djangoproject.com/en/1.8/ref/settings/#databases DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": os.path.join(BASE_DIR, "db.sqlite3"), } } @@ -86,9 +86,9 @@ # Internationalization # https://docs.djangoproject.com/en/1.8/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = "en-us" -TIME_ZONE = 'UTC' +TIME_ZONE = "UTC" USE_I18N = True @@ -100,6 +100,6 @@ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.8/howto/static-files/ -STATIC_URL = '/static/' +STATIC_URL = "/static/" -SETTINGS_NAME = 'default' +SETTINGS_NAME = "default" diff --git a/djclick/test/testprj/testprj/settings_alt.py b/djclick/test/testprj/testprj/settings_alt.py index a4c1483..c2955b3 100644 --- a/djclick/test/testprj/testprj/settings_alt.py +++ b/djclick/test/testprj/testprj/settings_alt.py @@ -1,3 +1,3 @@ from .settings import * # NOQA -SETTINGS_NAME = 'alternative' +SETTINGS_NAME = "alternative" diff --git a/djclick/test/testprj/testprj/urls.py b/djclick/test/testprj/testprj/urls.py index 7002397..9cf0362 100644 --- a/djclick/test/testprj/testprj/urls.py +++ b/djclick/test/testprj/testprj/urls.py @@ -17,5 +17,5 @@ from django.contrib import admin urlpatterns = [ - url(r'^admin/', include(admin.site.urls)), + url(r"^admin/", include(admin.site.urls)), ] diff --git a/setup.py b/setup.py index 75319e2..30ee66d 100755 --- a/setup.py +++ b/setup.py @@ -9,24 +9,24 @@ from setuptools import setup, find_packages -PACKAGE = 'djclick' -PACKAGE_NAME = 'django-click' -DESCRIPTION = 'Write Django management command using the click CLI library' +PACKAGE = "djclick" +PACKAGE_NAME = "django-click" +DESCRIPTION = "Write Django management command using the click CLI library" CLASSIFIERS = [ - 'Development Status :: 4 - Beta', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: MIT License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.3', - 'Programming Language :: Python :: 3.4', + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.3", + "Programming Language :: Python :: 3.4", ] -if sys.argv[-1] == 'publish': - os.system('python setup.py sdist bdist_wheel upload') +if sys.argv[-1] == "publish": + os.system("python setup.py sdist bdist_wheel upload") sys.exit() @@ -39,12 +39,12 @@ def read(fname, fail_silently=False): """ try: filepath = os.path.join(os.path.dirname(__file__), fname) - with io.open(filepath, 'rt', encoding='utf8') as f: + with io.open(filepath, "rt", encoding="utf8") as f: return f.read() except: if not fail_silently: raise - return '' + return "" @staticmethod def requirements(fname): @@ -52,20 +52,20 @@ def requirements(fname): Create a list of requirements from the output of the pip freeze command saved in a text file. """ - packages = Setup.read(fname, fail_silently=True).split('\n') + packages = Setup.read(fname, fail_silently=True).split("\n") packages = (p.strip() for p in packages) - packages = (p for p in packages if p and not p.startswith('#')) - packages = (p for p in packages if p and not p.startswith('https://')) - packages = (p for p in packages if p and not p.startswith('-r ')) + packages = (p for p in packages if p and not p.startswith("#")) + packages = (p for p in packages if p and not p.startswith("https://")) + packages = (p for p in packages if p and not p.startswith("-r ")) return list(packages) @classmethod def extra_requirements(cls, glob_pattern): - before, after = glob_pattern.split('*', 1) + before, after = glob_pattern.split("*", 1) pattern = os.path.join(os.path.dirname(__file__), glob_pattern) requirements = {} for path in glob.glob(pattern): - name = path[len(before):-len(after)] + name = path[len(before) : -len(after)] requirements[name] = cls.requirements(path) return requirements @@ -75,8 +75,8 @@ def get_files(*bases): List all files in a data directory. """ for base in bases: - basedir, _ = base.split('.', 1) - base = os.path.join(os.path.dirname(__file__), *base.split('.')) + basedir, _ = base.split(".", 1) + base = os.path.join(os.path.dirname(__file__), *base.split(".")) rem = len(os.path.dirname(base)) + len(basedir) + 2 @@ -86,41 +86,43 @@ def get_files(*bases): @staticmethod def get_metavar(name): - data = Setup.read(os.path.join(PACKAGE, '__init__.py')) - value = (re.search(u"__{}__\s*=\s*u?'([^']+)'".format(name), data) - .group(1).strip()) + data = Setup.read(os.path.join(PACKAGE, "__init__.py")) + print(name) + value = ( + re.search(u"__{}__\s*=\s*u?'([^']+)'".format(name), data).group(1).strip() + ) return value @classmethod def version(cls): - return cls.get_metavar('version') + return cls.get_metavar("version") @classmethod def url(cls): - return cls.get_metavar('url') + return cls.get_metavar("url") @classmethod def author(cls): - return cls.get_metavar('author') + return cls.get_metavar("author") @classmethod def email(cls): - return cls.get_metavar('email') + return cls.get_metavar("email") @classmethod def license(cls): - return cls.get_metavar('license') + return cls.get_metavar("license") @staticmethod def longdesc(): - return Setup.read('README.rst') + '\n\n' + Setup.read('HISTORY.rst') + return Setup.read("README.rst") + "\n\n" + Setup.read("HISTORY.rst") @staticmethod def test_links(): # Test if hardlinks work. This is a workaround until # http://bugs.python.org/issue8876 is solved - if hasattr(os, 'link'): - tempfile = __file__ + '.tmp' + if hasattr(os, "link"): + tempfile = __file__ + ".tmp" try: os.link(__file__, tempfile) except OSError as e: @@ -135,19 +137,21 @@ def test_links(): Setup.test_links() -setup(name=PACKAGE_NAME, - version=Setup.version(), - author=Setup.author(), - author_email=Setup.email(), - include_package_data=True, - zip_safe=False, - url=Setup.url(), - license=Setup.license(), - packages=find_packages(), - package_dir={PACKAGE: PACKAGE}, - description=DESCRIPTION, - install_requires=Setup.requirements('requirements.txt'), - extras_require=Setup.extra_requirements('requirements-*.txt'), - long_description=Setup.longdesc(), - entry_points=Setup.read('entry-points.ini', True), - classifiers=CLASSIFIERS) +setup( + name=PACKAGE_NAME, + version=Setup.version(), + author=Setup.author(), + author_email=Setup.email(), + include_package_data=True, + zip_safe=False, + url=Setup.url(), + license=Setup.license(), + packages=find_packages(), + package_dir={PACKAGE: PACKAGE}, + description=DESCRIPTION, + install_requires=Setup.requirements("requirements.txt"), + extras_require=Setup.extra_requirements("requirements-*.txt"), + long_description=Setup.longdesc(), + entry_points=Setup.read("entry-points.ini", True), + classifiers=CLASSIFIERS, +) From 48cc1c72f72c705eb1675d69a3fc3206c76b3817 Mon Sep 17 00:00:00 2001 From: "Allen, Timothy" Date: Fri, 12 Jun 2020 21:11:43 -0400 Subject: [PATCH 4/4] Remove print. --- setup.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/setup.py b/setup.py index bbc4db8..483c9ee 100755 --- a/setup.py +++ b/setup.py @@ -87,10 +87,6 @@ def get_files(*bases): @staticmethod def get_metavar(name): data = Setup.read(os.path.join(PACKAGE, "__init__.py")) -<<<<<<< HEAD - print(name) -======= ->>>>>>> c3337038f32900ebc5e606c621f1f28b537f64b8 value = ( re.search(u"__{}__\s*=\s*u?'([^']+)'".format(name), data).group(1).strip() )