Source

dotfiles / django_bash_completion

# #########################################################################
# This bash script adds tab-completion feature to django-admin.py and
# manage.py.
#
# Testing it out without installing
# =================================
#
# To test out the completion without "installing" this, just run this file
# directly, like so:
#
#     . ~/path/to/django_bash_completion
#
# Note: There's a dot ('.') at the beginning of that command.
#
# After you do that, tab completion will immediately be made available in your
# current Bash shell. But it won't be available next time you log in.
#
# Installing
# ==========
#
# To install this, point to this file from your .bash_profile, like so:
#
#     . ~/path/to/django_bash_completion
#
# Do the same in your .bashrc if .bashrc doesn't invoke .bash_profile.
#
# Settings will take effect the next time you log in.
#
# Uninstalling
# ============
#
# To uninstall, just remove the line from your .bash_profile and .bashrc.

# Enable extended pattern matching operators.
shopt -s extglob

_django_completion()
{
    local cur prev opts actions action_shell_opts action_runfcgi_opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"

    # Standalone options
    opts="--help --settings --pythonpath --noinput --noreload --format --indent --verbosity --adminmedia --version --locale --domain"
    # Actions
    # Added django-extensions actions
    actions="clean_pyc cleanup compile_pyc compilemessages create_app \
             create_command create_jobs createcachetable dbshell describe_form \
             diffsettings dumpdata dumpscript export_emails flush \
             generate_secret_key graph_models inspectdb loaddata mail_debug \
             makemessages passwd print_user_for_session reset reset_db runfcgi \
             runjob runjobs runprofileserver runscript runserver runserver_plus \
             set_fake_emails set_fake_passwords shell shell_plus show_urls sql \
             sqlall sqlclear sqlcustom sqldiff sqlflush sqlindexes \
             sqlinitialdata sqlreset sqlsequencereset startapp sync_media_s3 \
             syncdata syncdb test testserver validate"
    # Action's options
    action_shell_opts="--plain"
    action_runfcgi_opts="host port socket method maxspare minspare maxchildren daemonize pidfile workdir"

    if [[ # django-admin.py, django-admin, ./manage, manage.py
          ( ${COMP_CWORD} -eq 1 &&
            ( ${COMP_WORDS[0]} == django-admin.py ||
              ${COMP_WORDS[0]} == django-admin ||
              ${COMP_WORDS[0]} == ./manage.py ||
              ${COMP_WORDS[0]} == manage.py ) )
          ||
          # python manage.py, /some/path/python manage.py (if manage.py exists)
          ( ${COMP_CWORD} -eq 2 &&
            ( $( basename -- ${COMP_WORDS[0]} ) == python?([1-9]\.[0-9]) ) &&
            ( $( basename -- ${COMP_WORDS[1]} ) == manage.py) &&
            ( -r ${COMP_WORDS[1]} ) ) 
          ||
          ( ${COMP_CWORD} -eq 2 &&
            ( $( basename -- ${COMP_WORDS[0]} ) == python?([1-9]\.[0-9]) ) &&
            ( $( basename -- ${COMP_WORDS[1]} ) == django-admin.py) &&
            ( -r ${COMP_WORDS[1]} ) ) 
          ||
          ( ${COMP_CWORD} -eq 2 &&
            ( $( basename -- ${COMP_WORDS[0]} ) == python?([1-9]\.[0-9]) ) &&
            ( $( basename -- ${COMP_WORDS[1]} ) == django-admin) &&
            ( -r ${COMP_WORDS[1]} ) ) ]] ; then

        case ${cur} in
            -*)
                case ${prev} in
                    test)
                        opts="$opts --failfast"
                        ;;
                esac
                        
                COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
                action=$COMPREPLY
                return 0
                ;;
            *)
                COMPREPLY=( $(compgen -W "${actions}" -- ${cur}) )
                action=$COMPREPLY
                return 0
                ;;
        esac
    else
        case ${prev} in
            dumpdata|reset| \
            sql|sqlall|sqlclear|sqlcustom|sqlindexes| \
            sqlreset|sqlsequencereset)
                # App completion
                settings=""
                # If settings.py in the PWD, use that
                if [ -e settings.py ] ; then
                    settings="$PWD/settings.py"
                else
                    # Use the ENV variable if it is set
                    if [ $DJANGO_SETTINGS_MODULE ] ; then
                        settings=$DJANGO_SETTINGS_MODULE
                    fi
                fi
                # Couldn't find settings so return nothing
                if [ -z $settings ] ; then
                    COMPREPLY=()
                # Otherwise inspect settings.py file
                else
                    apps=`sed -n "/INSTALLED_APPS = (/,/)/p" $settings | \
                          grep -v "django.contrib" | 
                          sed -n "s/^[ ]*'\(.*\.\)*\(.*\)'.*$/\2 /pg" | \
                          tr -d "\n"`
                    COMPREPLY=( $(compgen -W "${apps}" -- ${cur}) )
                fi
                return 0
                ;;

            createcachetable|cleanup|compilemessages|dbshell| \
            diffsettings|inspectdb|makemessages| \
            runserver|startapp|startproject|syncdb| \
            validate)
                COMPREPLY=()
                return 0
                ;;
            shell)
                COMPREPLY=( $(compgen -W "$action_shell_opts" -- ${cur}) )
                return 0
                ;;
            runfcgi)
                COMPREPLY=( $(compgen -W "$action_runfcgi_opts" -- ${cur}) )
                return 0
                ;;
            host*|port*|socket*|method*|maxspare*|minspare*|maxchildren*|daemonize*|pidfile*|workdir*)
                if [ "$action"  == "runfcgi" ] ; then
                    COMPREPLY=( $(compgen -W "$action_runfcgi_opts" -- ${cur}) )
                    return 0
                fi
                return 0
                ;;
            *)
                #COMPREPLY=( $(compgen -W "auth core" -- ${cur}) )
                COMPREPLY=( ${cur}* )
                return 0
                ;;
        esac
    fi
}

complete -o filenames -F _django_completion django-admin.py manage.py django-admin

# Support for multiple interpreters.
unset pythons
if command -v whereis &>/dev/null; then
    python_interpreters=$(whereis python | cut -d " " -f 2-) 
    for python in $python_interpreters; do
        pythons="${pythons} $(basename -- $python)"
    done
    pythons=$(echo $pythons | tr " " "\n" | sort -u | tr "\n" " ")
else
    pythons=python    
fi

complete -F _django_completion -o default $pythons
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.