Write Django management command using the click CLI library

Overview

Django Click

Project information:

Automated code metrics:

django-click is a library to easily write Django management commands using the click command line library.

  • Free software: MIT license
  • Documentation for the Click command line library: http://click.pocoo.org/7/
  • Compatible with Django 2.2 or 3.0 running on Python 3.6, 3.7, 3.8, and PyPy.

Installation

pip install django-click

Example

Create a command module as you would usually do, but instead of creating a class, just put a djclick command into <yourapp>/management/commands/helloworld.py:

import djclick as click

@click.command()
@click.argument('name')
def command(name):
    click.secho('Hello, {}'.format(name), fg='red')

And then call the command with:

$ ./manage.py helloworld django-click
Hello, django-click

Check out the test commands for additional example commands and advanced usage.

Comments
  • Django-click doesn't work with click >= 7.1

    Django-click doesn't work with click >= 7.1

    When installing a version of click later than 7.0, the djclick import fails with an error:

        import djclick
    /usr/local/lib/python3.6/site-packages/djclick/__init__.py:16: in <module>
        __all__ = click.__all__ + ['pass_verbosity']
    E   AttributeError: module 'click' has no attribute '__all__'
    

    The click module does not define __all__ as of 7.1 and later.

    opened by ykshatroff 5
  • click.exceptions.MissingParameter: None

    click.exceptions.MissingParameter: None

    click==6.6, django-click==1.2.0, django==1.5.12

    If the one required parameter is omitted from the following management command, the user sees the error message in the subject of this issue

    import djclick as click
    
    @click.command()
    @click.argument('name')
    def command(name):
       click.secho('Hello, {}'.format(name), fg='red')
    

    If the one required parameter is omitted from the following command, the user sees a better error message.

    import click
    
    @click.command()
    @click.argument('name')
    def hello(name):
        click.secho('Hello, {}'.format(name), fg='red')
    
    if __name__ == '__main__':
        hello()
    
    $ python foo.py 
    Usage: foo.py [OPTIONS] NAME
    
    Error: Missing argument "name".
    

    Any ideas? This would seem to be a django-click issue?

    opened by trawick 3
  • Allow other lookups in `ModelInstance`

    Allow other lookups in `ModelInstance`

    Currently ModelInstance allows lookups only by pk. This PR adds support for arbitrary lookups by adding a lookup keyword argument.

    Example:

    @clik.option('--something', type=ModelInstance(SomeModel, lookup='name'))
    

    (This PR is intended to be merged on top of the changes from #2 )

    opened by ulope 3
  • Use commands.py instead of management/commands/each_one.py

    Use commands.py instead of management/commands/each_one.py

    This will allow getting rid of this rediculous deep directory structure and lots of files. It should be still possible to split commands into several files, but python way:

    commands/
        __init__.py
        command1.py
        command2.py
        filecommands.py
        utils.py
    

    with commands/__init__.py:

    from .command1 import Command1
    from .command2 import Command2
    from .filecommands import *
    

    Different splitting srategies are possible this way: single file for command or file for some logical command group or just no splitting. Also this resembles how models.py was split.

    wontfix 
    opened by Suor 3
  • Click 7.1 breaks django-click

    Click 7.1 breaks django-click

    click 7.1 dropped a few hours ago, and out of the box, creates errors with django-click:

    module 'click' has no attribute '__all__'

    This will keep deployments from breaking in the meantime.

    opened by FlipperPA 2
  • Port `.travis.yml` to GitHub Actions

    Port `.travis.yml` to GitHub Actions

    This PR closes #34.

    Ports the existing .travis.yml file over to GitHub Actions with full feature parity.

    Passing tests from last commit.

    Coveralls upload step is commented out since I do not have access to that external system and I wanted to show all green across the board for the passing tests.

    opened by joshuadavidthomas 1
  • Click 8 is a rejected dependency

    Click 8 is a rejected dependency

    A couple of days ago, Click 8 was released. I've since tried using this with a project that has a dependency on Click 8, which led to some invalid dependency resolution due to the fact that django-click specifies a strict upper bound smaller than 7.2. Is there any reason why that limit is enforced, or can it be removed? Alternatively, is there more work that's needed to check that it runs with Click 8 and enable that?

    opened by DragosDumitrache 1
  • Fix issues with recent versions of click and django

    Fix issues with recent versions of click and django

    Fix multiple issues with recent versions of click and Django:

    • Django 3 removes Python 2 compatibility shims, like python_2_unicode_compatible; use the one from six instead
    • Django 3 handles ArgumentParser's mutually exclusive groups; add the attribute to ArgumentParserAdapt to make Django happy
    • Recent versions of click do not exit on ctx.exit() if standalone_mode = False, instead returning the exit code from Command.main(); use that exit code and exit "manually" instead, if it's non-zero
    • Different versions of click cases metavars differently; lowercase some output in tests to make checking equality more compatible with multiple click versions
    • Different versions of pytest stringifies ExceptionInfo differently; match against exception message in tests instead of checking against how pytest formats its wrapper
    • Fix help and usage output to show command names correctly; specifically, don't show the base command name twice, and show it (once) when showing usage for sub-commands (Fixes #8)
    • Style CommandError like Django, with red, bold text
    opened by simonpercivall 1
  • Bumped django/python versions to test against.

    Bumped django/python versions to test against.

    Also made tox/travis configs easier to maintain by simply listing all python/django mixes separately.

    Am doing that as currently package looks like abandonware. Once everything passes I'd update other files/bump package version.

    opened by lukaszb 1
  • Update tests

    Update tests

    Various test updates. In detail:

    • Test on Python 3.5 and Django 1.9
    • Rename pypy19 tox env to pypy since pypy19 is not recognized by tox as pypy and caused the tests to run on cpython 2.7 instead
    • Fixes some failing Python 3 tests
    • Add coverage terminal reporting output
    • Add pytest-django. This allows to use real models in test_params instead of the DummyQuerySet
    opened by ulope 1
  • Move from Travis CI to Github Actions for CI

    Move from Travis CI to Github Actions for CI

    Since June earlier this year, Travis CI no longer supports free open source CI. If you look at the Travis builds, you can see they haven't been running since then.

    Github Actions has become the defacto standard for CI for open source projects. This repository offers a good template for using a testing matrix against all the different versions of Python & Django this package needs to support.

    opened by joshuadavidthomas 0
  • Raising Abort Causes Stacktrace Instead of Clean Shutdown.

    Raising Abort Causes Stacktrace Instead of Clean Shutdown.

    When either sending a SIGINT or using raise click.Abort, I would expect the application to shut down cleanly with the appropriate error code. Instead, I get the following stack trace:

    Traceback (most recent call last):
      File "./manage.py", line 24, in <module>
        execute_from_command_line(sys.argv)
      File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
        utility.execute()
      File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 375, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/usr/local/lib/python3.8/site-packages/djclick/adapter.py", line 68, in run_from_argv
        exit_code = self.main(
      File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1055, in main
        rv = self.invoke(ctx)
      File "/usr/local/lib/python3.8/site-packages/djclick/adapter.py", line 50, in invoke
        return super(DjangoCommandMixin, self).invoke(ctx)
      File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1657, in invoke
        return _process_result(sub_ctx.command.invoke(sub_ctx))
      File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1404, in invoke
        return ctx.invoke(self.callback, **ctx.params)
      File "/usr/local/lib/python3.8/site-packages/click/core.py", line 760, in invoke
        return __callback(*args, **kwargs)
      File "/srv/service/vite_frontend/management/commands/frontend.py", line 157, in dev
        f.write(f"{app.name}\n{process.pid}\n")
      File "/usr/local/lib/python3.8/contextlib.py", line 120, in __exit__
        next(self.gen)
      File "/srv/service/vite_frontend/management/commands/frontend.py", line 70, in run_vite
        yield process
      File "/usr/local/lib/python3.8/contextlib.py", line 120, in __exit__
        next(self.gen)
      File "/srv/service/vite_frontend/management/commands/frontend.py", line 47, in run_in_app
        raise click.Abort()
    

    We have worked around this by instead throwing a SystemExit exception, but it would be nice to be able to use Abort

    opened by peacememories 0
  • Add typing annotations

    Add typing annotations

    Hi and thanks for maintaining this convenient library. It really makes our management commands look a lot cleaner. What's missing for us at the moment, though, is typing annotations, since we're running mypy on all of our code.

    Right now we're working around this by creating a stub for mypy to use, but it would obviously be much better to have first party type annotations. Is this something that's planned/you're interested in adding?

    Thanks for considering :)

    opened by peacememories 2
  • Typer Integration

    Typer Integration

    I am usually using Typer on top of Click for command line. This gives a nice way to use Type hints to define variables. https://typer.tiangolo.com

    How complex do you think it would be to have a Typer adopter for django-click?

    opened by Benoss 4
  • stdout does not work on `call_command`

    stdout does not work on `call_command`

    Assuming we have a command named foo...

    import io
    
    buffer = io.StringIO()
    from django.core.management import call_command
    call_command("foo", stdout=buffer)
    out = buffer.getvalue()
    assert "whatever" in out
    

    This is not possible with django-click, instead saying:

    TypeError: Unknown option(s) for dumb command: stdout. Valid options are: color, h, help, pythonpath, settings, traceback, v, verbosity, version.
    

    Environment

    • Django 3.2.5
    • Python 3.8
    • Poetry 1.1.7
    • Pytest 6.2.4
    • Pytest Django 4.4.0
    • (if relevant) Ubuntu 20.04
    opened by erayerdin 0
  • Can't pass

    Can't pass "help" parameter to click argument

    The following script works with the base click library but raises an exception with the django-click library.

    import djclick as click
    
    @click.command()
    @click.argument("name", help="Some name")
    def command(name):
        click.echo(f"Hi {name}!")
    

    Exception:

    Traceback (most recent call last):
      File "/app/./manage.py", line 22, in <module>
        main()
      File "/app/./manage.py", line 18, in main
        execute_from_command_line(sys.argv)
      File "/usr/local/lib/python3.9/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
        utility.execute()
      File "/usr/local/lib/python3.9/site-packages/django/core/management/__init__.py", line 395, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/usr/local/lib/python3.9/site-packages/django/core/management/__init__.py", line 244, in fetch_command
        klass = load_command_class(app_name, subcommand)
      File "/usr/local/lib/python3.9/site-packages/django/core/management/__init__.py", line 37, in load_command_class
        module = import_module('%s.management.commands.%s' % (app_name, name))
      File "/usr/local/lib/python3.9/importlib/__init__.py", line 127, in import_module
        return _bootstrap._gcd_import(name[level:], package, level)
      File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
      File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
      File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
      File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
      File "<frozen importlib._bootstrap_external>", line 790, in exec_module
      File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
      File "/app/core/management/commands/click1.py", line 6, in <module>
        def command(name):
      File "/usr/local/lib/python3.9/site-packages/click/decorators.py", line 168, in decorator
        _param_memo(f, ArgumentClass(param_decls, **attrs))
      File "/usr/local/lib/python3.9/site-packages/click/core.py", line 1984, in __init__
        Parameter.__init__(self, param_decls, required=required, **attrs)
    TypeError: __init__() got an unexpected keyword argument 'help'
    
    opened by johnnymetz 0
  • call_command replacement

    call_command replacement

    I'm trying to call a djclick based management command using the traditional Django API, django.core.management.call_command and I'm getting this traceback:

    Traceback (most recent call last):
      File "_log.py", line 34, in <module>
        call_command('sync_models')
      File "/home/user/.cache/pypoetry/virtualenvs/ht-ZBbfQ9hA-py3.8/lib/python3.8/site-packages/django/core/management/__init__.py", line 135, in call_command
        for group in parser._mutually_exclusive_groups
    AttributeError: 'ArgumentParserAdapter' object has no attribute '_mutually_exclusive_groups'
    

    I could do from myproject.myapp.management.commands.my_command import command although the command I'm using is the grouping feature.

    What would be the advised methodology to run the command in a programmatic fashion?

    opened by D3f0 1
Releases(2.3.0)
  • 2.3.0(Sep 7, 2021)

  • 2.2.0(Jul 20, 2020)

  • v2.1.1(Jun 12, 2020)

    This release will ensure the version of click is lower then 7.1 for compatibility.

    • Final release to support Python 2.7, 3.4 & 3.5.
    • Final release to support Django 1.11, 2.0 & 2.1.
    Source code(tar.gz)
    Source code(zip)
Owner
Jonathan Stoppani
Jonathan Stoppani
Play WORDLE game in your terminal.

Wordle TUI Play WORDLE game in your terminal. The game will be kept the same as the Web version. Prerequisites Python 3.7+ Linux/MacOS (Windows is not

Frost Ming 61 Oct 30, 2022
A clone of the popular online game Wordle

wordle_clone A CLI application for wordle. Description A clone of the popular online game Wordle.

0 Jan 29, 2022
gcptree - Like the unix tree command but for GCP Org Heirarchy

gcptree Like the unix tree command but for GCP Org Heirarchy. For a note on coloring, the org node is green, folders and blue, and projects that are n

Ryan Canty 25 Sep 06, 2022
stonky is a simple command line dashboard for monitoring stocks.

stonky is a simple command line dashboard for monitoring stocks.

Jessy Williams 228 Dec 14, 2022
AutoSub is a CLI application to generate subtitle files (.srt, .vtt, and .txt transcript) for any video file using Mozilla DeepSpeech.

AutoSub About Motivation Installation Docker How-to example How it works TO-DO Contributing References About AutoSub is a CLI application to generate

Abhiroop Talasila 414 Jan 06, 2023
Terminal-based keyboard testing

kbdtest kbdtest is a simple Python program that tests keyboard input using an interactive, terminal-based, visual keyboard display. It was originally

Ruunyox 12 Jul 19, 2022
Linux commands Interpreter for Windows and Mac based systems using Python

DBHTermEcIbP Linux commands Interpreter for Windows and Mac based systems using Python Basic Linux commands supported viewing current working director

Vraj Patel 1 Dec 26, 2021
A python script that enables a raspberry pi sd card through the CLI and automates the process of configuring network details and ssh.

This project is one script (wpa_helper.py) written in python that will allow for the user to automate the proccess of setting up a new boot disk and configuring ssh and network settings for the pi

Theo Kirby 6 Jun 24, 2021
asciinema - Terminal session recorder 📹

asciinema - Terminal session recorder 📹

asciinema 11.1k Dec 27, 2022
An question and answer shell environment based on xonsh using ansible for setup

An question and answer shell environment based on xonsh using ansible for setup

Steven Hollingsworth 2 Jan 11, 2022
Several tools that can be added to your `PATH` to make your life easier.

CK-CLI Tools Several tools that can be added to your PATH to make your life easier. prettypath Prints the $PATH variable in a human-readable way. It a

Christopher Kumm 2 Apr 21, 2022
The command line interface for Gradient - Gradient is an an end-to-end MLOps platform

Gradient CLI Get started: Create Account • Install CLI • Tutorials • Docs Resources: Website • Blog • Support • Contact Sales Gradient is an an end-to

Paperspace 58 Dec 06, 2022
Yts-cli-streamer - A CLI movie streaming client which works on yts.mx API written in python

YTSP It is a CLI movie streaming client which works on yts.mx API written in pyt

1 Feb 05, 2022
Command line tool for google dorks

CLI for google dorks This is the command line tool made with pytohn which allows the users to perform Google dorks easily Installation Install google

subrahmanya s hegade 3 Feb 08, 2022
Custom 64 bit shellcode encoder that evades detection and removes some common badchars (\x00\x0a\x0d\x20)

x64-shellcode-encoder Custom 64 bit shellcode encoder that evades detection and removes some common badchars (\x00\x0a\x0d\x20) Usage Using a generato

Cole Houston 2 Jan 26, 2022
A CLI for advanced management of your notes with simple commands

PyNoteManager This is a CLI for advanced management of your notes with simple co

3 Dec 30, 2021
CLI Web-CAT interface for people who use VIM.

CLI Web-CAT CLI Web-CAT interface. Installation git clone https://github.com/phuang1024/cliwebcat cd cliwebcat python setup.py bdist_wheel sdist cd di

Patrick 4 Apr 11, 2022
Colab-xterm allows you to open a terminal in a cell

colab-xterm Colab-xterm allows you to open a terminal in a cell. Usage Install package and load the extension !pip install git+https://github.com/popc

InfuseAI 194 Dec 29, 2022
pwy - A simple weather tool.

A simple weather tool. I made this as a way for me to learn Python, API, and PyPi packaging. Name changed from wwy to pwy.

Clint 105 Dec 31, 2022
Play videos in the terminal.

Termvideo Play videos in the terminal (stdout). python main.py /path/to/video.mp4 Terminal size: -x output_width, -y output_height. Default autodetect

Patrick 11 Jun 13, 2022