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
A terminal tool for git. When we use git, do you feel very uncomfortable with too long commands

PIGIT A terminal tool for git. When we use git, do you feel very uncomfortable with too long commands. For example: git status --short, this project c

Zachary 1 Apr 09, 2022
An awesome Python wrapper for an awesome Docker CLI!

An awesome Python wrapper for an awesome Docker CLI!

Gabriel de Marmiesse 303 Jan 03, 2023
Basic python tools to generate shellcode runner in vba

vba_bin_runner Basic python tools to generate shellcode runner in vba. The stub use ZwAllocateVirtualMemory to allocate memory, RtlMoveMemory to write

4 Aug 24, 2021
A command line utility for tracking a stock market portfolio. Primarily featuring high resolution braille graphs.

A command line stock market / portfolio tracker originally insipred by Ericm's Stonks program, featuring unicode for incredibly high detailed graphs even in a terminal.

Conrad Selig 51 Nov 29, 2022
Command Line (CLI) Application to automate creation of tasks in Redmine, issues on Github and the sync process of them.

Task Manager Automation Tool (TMAT) CLI Command Line (CLI) Application to automate creation of tasks in Redmine, issues on Github and the sync process

Tiamat 5 Apr 12, 2022
Command-line program for organizing and managing ebook collections

Command-line program for organizing and managing ebook collections. It is a Python port from the original shell scripts ebook-tools

Raul 14 Nov 12, 2022
PyArmor is a command line tool used to obfuscate python scripts

PyArmor is a command line tool used to obfuscate python scripts, bind obfuscated scripts to fixed machine or expire obfuscated scripts.

Dashingsoft 2k Jan 07, 2023
Python and data science snippets on the command line

Python Snippet Tool A tool to get Python and data science snippets at Data Science Simplified on the command line. You can read my article to learn ho

Khuyen Tran 19 Dec 21, 2022
Python3 parser for Apple's crash reports

pyCrashReport in intended for analyzing crash reports from Apple devices into a clearer view, without all the thread listing and loaded images, just the actual data you really need to debug the probl

7 Aug 19, 2022
A Python module and command-line utility for converting .ANS format ANSI art to HTML

ansipants A Python module and command-line utility for converting .ANS format ANSI art to HTML. Installation pip install ansipants Command-line usage

4 Oct 16, 2022
Command-line script to upload videos to Youtube using theYoutube APIv3.

Introduction Command-line script to upload videos to Youtube using theYoutube APIv3. It should work on any platform (GNU/Linux, BSD, OS X, Windows, ..

Arnau Sanchez 1.9k Jan 09, 2023
A very simple OpenContest command line client written in Python

OpenContest Client A very simple OpenContest command line client written in Python. The only dependency is the requests library. Tested with Linux onl

Ladue Computer Science 1 May 25, 2022
ddgr is a cmdline utility to search DuckDuckGo (html version) from the terminal

ddgr is a cmdline utility to search DuckDuckGo (html version) from the terminal. While googler is extremely popular among cmdline users, in many forums the need of a similar utility for privacy-aware

PiƱa Colada 2.5k Dec 25, 2022
f90nml - A Fortran namelist parser, generator, and editor

f90nml - A Fortran namelist parser, generator, and editor A Python module and command line tool for parsing Fortran namelist files Documentation The c

Marshall Ward 110 Dec 14, 2022
Double Pendulum visualised with fetching system information in Python.

Show off your terminal, in style. A nice relaxing double pendulum simulation using ASCII, able to simulate multiple pendulums at once, and provide tra

Nekurone 62 Dec 14, 2022
ForX - get forex quotes from the terminal

A command line tool for checking exchange rates between currencies, both crypto and fiat.

Gabe Banks 52 Dec 10, 2022
A simple command line tool written in python to manage a to-do list

A simple command line tool written in python to manage a to-do list Dependencies: python Commands: todolist (-a | --add) [(-p | --priority)] [(-l | --

edwloef 0 Nov 02, 2021
A terminal slots programme in PY

PYSlots PyPI and Test PyPI External Links PyPI Test PyPI Install Look directly at the bugs! Version pip install pyslots "Don't look directly at the bu

Luke Batema 4 Nov 30, 2022
Konsave lets use save your KDE Plasma customizatios and restore them very easily!

Konsave (Save Plasma Customization) A CLI program that will let you save and apply your KDE Plasma customizations with just one command! Als

439 Jan 02, 2023
A curated list of awesome things related to Textual

Awesome Textual | A curated list of awesome things related to Textual. Textual is a TUI (Text User Interface) framework for Python inspired by modern

Marcelo Trylesinski 5 May 08, 2022