commit
169e3dee9f
|
@ -0,0 +1,564 @@
|
|||
#compdef rails
|
||||
# ------------------------------------------------------------------------------
|
||||
# Description
|
||||
# -----------
|
||||
#
|
||||
# Completion script for Ruby on Rails (http://rubyonrails.org/).
|
||||
#
|
||||
# ------------------------------------------------------------------------------
|
||||
# Authors
|
||||
# -------
|
||||
#
|
||||
# * Kazuya Takeshima (https://github.com/mitukiii)
|
||||
#
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
|
||||
_rails() {
|
||||
local context state line curcontext="$curcontext"
|
||||
|
||||
if (( CURRENT > 2 )); then
|
||||
(( CURRENT-- ))
|
||||
shift words
|
||||
_call_function - "_rails_${words[1]}" || _nothing
|
||||
else
|
||||
__rails_commands
|
||||
fi
|
||||
}
|
||||
|
||||
__rails_commands() {
|
||||
local context state line curcontext="$curcontext"
|
||||
|
||||
local -a rails_options
|
||||
__rails_setup_rails_options
|
||||
|
||||
_arguments -C \
|
||||
$rails_options \
|
||||
': :->command'
|
||||
|
||||
case "$state" in
|
||||
command)
|
||||
local -a commands
|
||||
local application_directory
|
||||
__rails_setup_application_directory
|
||||
|
||||
if [ -n "$application_directory" ]; then
|
||||
commands=(
|
||||
{generate,g}'[Generate new code]'
|
||||
{console,c}'[Start the Rails console]'
|
||||
{server,s}'[Start the Rails server]'
|
||||
{dbconsole,db}'[Start a console for the database specified in config/database.yml]'
|
||||
application'[Generate the Rails application code]'
|
||||
{destroy,d}'[Undo code generated with "generate"]'
|
||||
benchmarker'[See how fast a piece of code runs]'
|
||||
profiler'[Get profile information from a piece of code]'
|
||||
plugin'[Install a plugin]'
|
||||
{runner,r}'[Run a piece of code in the application environment]'
|
||||
)
|
||||
else
|
||||
commands=(
|
||||
new'[Create a new Rails application]'
|
||||
)
|
||||
fi
|
||||
|
||||
_values 'command' $commands
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
__rails_setup_application_directory() {
|
||||
application_directory="$(pwd)"
|
||||
|
||||
while [ -n "$application_directory" ]; do
|
||||
if [ -f "${application_directory}/script/rails" ]; then
|
||||
return
|
||||
fi
|
||||
application_directory="${application_directory%/*}"
|
||||
done
|
||||
|
||||
application_directory=
|
||||
}
|
||||
|
||||
__rails_setup_rails_options() {
|
||||
rails_options=(
|
||||
{-h,--help}'[Show this help message and quit]'
|
||||
{-v,--version}'[Show Rails version number and quit]'
|
||||
)
|
||||
}
|
||||
|
||||
__rails_setup_runtime_options() {
|
||||
runtime_options=(
|
||||
'(-f --force)'{-f,--force}'[Overwrite files that already exist]'
|
||||
'(-p --pretend)'{-p,--pretend}'[Run but do not make any changes]'
|
||||
'(-q --quiet)'{-q,--quiet}'[Suppress status output]'
|
||||
'(-s --skip)'{-s,--skip}'[Skip files that already exist]'
|
||||
)
|
||||
}
|
||||
|
||||
__rails_setup_generators_options() {
|
||||
local -a runtime_options
|
||||
__rails_setup_runtime_options
|
||||
|
||||
generators_options=(
|
||||
$runtime_options
|
||||
--skip-namespace'[Skip namespace (affects only isolated applications)]'
|
||||
--old-style-hash"[Force using old style hash (:foo => 'bar') on Ruby >= 1.9]"
|
||||
)
|
||||
}
|
||||
|
||||
__rails_setup_model_generators_options() {
|
||||
local -a generators_options
|
||||
__rails_setup_generators_options
|
||||
|
||||
model_generators_options=(
|
||||
$generators_options
|
||||
'(-o --orm)'{-o,--orm=}'[Orm to be invoked]:orm'
|
||||
)
|
||||
}
|
||||
|
||||
__rails_setup_resource_generators_options() {
|
||||
local -a model_generators_options
|
||||
__rails_setup_model_generators_options
|
||||
|
||||
resource_generators_options=(
|
||||
$model_generators_options
|
||||
--force-plural'[Forces the use of a plural ModelName]'
|
||||
--resource-route'[Indicates when to generate resource route]: :__rails_boolean'
|
||||
)
|
||||
}
|
||||
|
||||
__rails_boolean() {
|
||||
_values 'boolean' 'true' 'false'
|
||||
}
|
||||
|
||||
__rails_migration_fields() {
|
||||
if compset -P '*:*:'; then
|
||||
_values 'index' 'index' 'uniq'
|
||||
else
|
||||
if compset -P '*:'; then
|
||||
_values -s ':' 'type' 'string' 'text' 'integer' 'float' 'decimal' 'datetime' 'timestamp' 'time' 'date' 'binary' 'boolean'
|
||||
else
|
||||
_guard '[[:alnum:]_]#' 'field'
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
_rails_generate() {
|
||||
local context state line curcontext="$curcontext"
|
||||
|
||||
if (( CURRENT > 2 )); then
|
||||
(( CURRENT-- ))
|
||||
shift words
|
||||
_call_function - "_rails_generate_${words[1]}" || _rails_generate_default
|
||||
else
|
||||
__rails_generate_commands
|
||||
fi
|
||||
}
|
||||
|
||||
_rails_g() {
|
||||
_rails_generate
|
||||
}
|
||||
|
||||
__rails_generate_commands() {
|
||||
local -a rails_generators
|
||||
rails_generators=(
|
||||
assets:'Stubs out new asset placeholders'
|
||||
controller:'Stubs out a new controller and its views'
|
||||
generator:'Stubs out a new generator at lib/generators'
|
||||
helper:'Stubs out a new helper'
|
||||
integration_test:'Stubs out a new integration test'
|
||||
mailer:'Stubs out a new mailer and its views'
|
||||
migration:'Stubs out a new database migration'
|
||||
model:'Stubs out a new model'
|
||||
observer:'Stubs out a new observer'
|
||||
performance_test:'Stubs out a new performance test'
|
||||
resource:'Stubs out a new resource including an empty model and controller suitable for a restful, resource-oriented application'
|
||||
scaffold:'Scaffolds an entire resource, from model and migration to controller and views, along with a full test suite'
|
||||
scaffold_controller:'Stubs out a scaffolded controller, its seven RESTful actions and related views. Pass the model name, either CamelCased or under_scored'
|
||||
session_migration:'Creates a migration to add the sessions table used by the ORM session store'
|
||||
task:'Stubs out a new Rake task'
|
||||
)
|
||||
_describe -t rails_generators 'rails generator' rails_generators
|
||||
|
||||
local cache_name
|
||||
local -a all_generators
|
||||
cache_name="rails_${$(pwd)##*/}_all_generators"
|
||||
if ! _retrieve_cache ${cache_name}; then
|
||||
all_generators=($(_call_program rails_generators rails generate 2> /dev/null | awk '/^ [a-zA-Z_]+/{ print $1 }'))
|
||||
_store_cache ${cache_name} all_generators
|
||||
fi
|
||||
|
||||
local -a -U namespaces
|
||||
local namespace
|
||||
local -a generators
|
||||
namespaces=(${(R)${(M)all_generators:#*:*}%:*})
|
||||
for namespace in $namespaces; do
|
||||
generators=(${${(M)all_generators:#${namespace}:*}/:/\\:})
|
||||
_describe -t ${namespace}_generators "${namespace/_/ } generator" generators
|
||||
done
|
||||
}
|
||||
|
||||
_rails_generate_default() {
|
||||
local -a generators_options
|
||||
__rails_setup_generators_options
|
||||
|
||||
_arguments \
|
||||
$generators_options \
|
||||
'*:argument'
|
||||
}
|
||||
|
||||
_rails_generate_assets() {
|
||||
local -a generators_options
|
||||
__rails_setup_generators_options
|
||||
|
||||
_arguments \
|
||||
$generators_options \
|
||||
'(-j --javascripts)'{-j,--javascripts}'[Generate JavaScripts]: :__rails_boolean' \
|
||||
'(-y --stylesheets)'{-y,--stylesheets}'[Generate Stylesheets]: :__rails_boolean' \
|
||||
'(-je --javascript-engine)'{-je,--javascript-engine=}'[Engine for JavaScripts]:javascript engine' \
|
||||
'(-se --stylesheet-engine)'{-se,--stylesheet-engine=}'[Engine for Stylesheets]:stylesheet engine' \
|
||||
': :_guard "^-*" "name"'
|
||||
}
|
||||
|
||||
_rails_generate_controller() {
|
||||
local -a generators_options
|
||||
__rails_setup_generators_options
|
||||
|
||||
_arguments \
|
||||
$generators_options \
|
||||
'(-e --template-engine)'{-e,--template-engine=}'[Template engine to be invoked]:template engine' \
|
||||
'(-t --test-framework)'{-t,--test-framework=}'[Test framework to be invoked]:test framework' \
|
||||
--helper'[Indicates when to generate helper]: :__rails_boolean' \
|
||||
--assets'[Indicates when to generate assets]: :__rails_boolean' \
|
||||
': :_guard "^-*" "name"' \
|
||||
'*: :_guard "^-*" "action"'
|
||||
}
|
||||
|
||||
_rails_generate_generator() {
|
||||
local -a generators_options
|
||||
__rails_setup_generators_options
|
||||
|
||||
_arguments \
|
||||
$generators_options \
|
||||
--namespace'[Namespace generator under lib/generators/name]: :__rails_boolean' \
|
||||
': :_guard "^-*" "name"'
|
||||
}
|
||||
|
||||
_rails_generate_helper() {
|
||||
local -a generators_options
|
||||
__rails_setup_generators_options
|
||||
|
||||
_arguments \
|
||||
$generators_options \
|
||||
'(-t --test-framework)'{-t,--test-framework=}'[Test framework to be invoked]:test framework' \
|
||||
': :_guard "^-*" "name"' \
|
||||
}
|
||||
|
||||
_rails_generate_integration_test() {
|
||||
local -a generators_options
|
||||
__rails_setup_generators_options
|
||||
|
||||
_arguments \
|
||||
$generators_options \
|
||||
--integration-tool='[Integration tool to be invoke]:integration tool' \
|
||||
': :_guard "^-*" "name"' \
|
||||
}
|
||||
|
||||
_rails_generate_mailer() {
|
||||
local -a generators_options
|
||||
__rails_setup_generators_options
|
||||
|
||||
_arguments \
|
||||
$generators_options \
|
||||
'(-e --template-engine)'{-e,--template-engine=}'[Template engine to be invoked]:template engine' \
|
||||
'(-t --test-framework)'{-t,--test-framework=}'[Test framework to be invoked]:test framework' \
|
||||
': :_guard "^-*" "name"' \
|
||||
'*: :_guard "^-*" "method"'
|
||||
}
|
||||
|
||||
_rails_generate_migration() {
|
||||
local -a modelgenerators_options
|
||||
__rails_setup_model_generators_options
|
||||
|
||||
_arguments \
|
||||
$model_generators_options \
|
||||
': :_guard "^-*" "name"' \
|
||||
'*: :__rails_migration_fields'
|
||||
}
|
||||
|
||||
_rails_generate_model() {
|
||||
_rails_generate_migration
|
||||
}
|
||||
|
||||
_rails_generate_observer() {
|
||||
local -a model_generators_options
|
||||
__rails_setup_model_generators_options
|
||||
|
||||
_arguments \
|
||||
$model_generators_options \
|
||||
': :_guard "^-*" "name"'
|
||||
}
|
||||
|
||||
_rails_generate_performance_test() {
|
||||
local -a generators_options
|
||||
__rails_setup_generators_options
|
||||
|
||||
_arguments \
|
||||
$generators_options \
|
||||
--performance-tool='[Performance tool to be invoked]:performance tool' \
|
||||
': :_guard "^-*" "name"' \
|
||||
}
|
||||
|
||||
_rails_generate_resource() {
|
||||
local context state line curcontext="$curcontext"
|
||||
|
||||
local -a resource_generators_options
|
||||
__rails_setup_resource_generators_options
|
||||
|
||||
_arguments -C \
|
||||
$resource_generators_options \
|
||||
'(-c --resource-controller)'{-c,--resource-controller=}'[Resource controller to be invoked]:name' \
|
||||
'(-a --actions)'{-a,--actions=}'[Actions for the resource controller]: :->actions' \
|
||||
': :->name' \
|
||||
'*: :->fields'
|
||||
|
||||
if (( words[(I)(--actions=*|-a)] > 0 && words[(I)(--actions=*|-a)] == words[(I)-*] )); then
|
||||
state=actions
|
||||
fi
|
||||
|
||||
case "$state" in
|
||||
actions)
|
||||
_guard "[[:alnum:]_]#" "actions"
|
||||
;;
|
||||
name)
|
||||
_guard "^-*" "name"
|
||||
;;
|
||||
fields)
|
||||
__rails_migration_fields
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
_rails_generate_scaffold() {
|
||||
local -a resource_generators_options
|
||||
__rails_setup_resource_generators_options
|
||||
|
||||
_arguments \
|
||||
$resource_generators_options \
|
||||
'(-y --stylesheets)'{-y,--stylesheets}'[Generate Stylesheets]: :__rails_boolean' \
|
||||
'(-se --stylesheet-engine)'{-se,--stylesheet-engine=}'[Engine for Stylesheets]:stylesheet engine' \
|
||||
'(-c --scaffold-controller)'{-c,--scaffold-controller=}'[Scaffold controller to be invoked]:name' \
|
||||
--assets'[Indicates when to generate assets]:boolean:(true false)' \
|
||||
': :_guard "^-*" "name"' \
|
||||
'*: :__rails_migration_fields'
|
||||
}
|
||||
|
||||
_rails_generate_scaffold_controller() {
|
||||
local -a model_generators_options
|
||||
__rails_setup_model_generators_options
|
||||
|
||||
_arguments \
|
||||
$model_generators_options \
|
||||
'(-e,--template-engine)'{-e,--template-engine=}'[Template engine to be invoked]:template engine' \
|
||||
'(-t,--test-framework)'{-t,--test-framework=}'[Test framework to be invoked]:test framework' \
|
||||
--helper'[Indicates when to generate helper]: :__rails_boolean' \
|
||||
': :_guard "^-*" "name"'
|
||||
}
|
||||
|
||||
_rails_generate_session_migration() {
|
||||
local -a model_generators_options
|
||||
__rails_setup_model_generators_options
|
||||
|
||||
_arguments \
|
||||
$model_generators_options \
|
||||
': :_guard "^-*" "name"'
|
||||
}
|
||||
|
||||
_rails_generate_task() {
|
||||
local -a generators_options
|
||||
__rails_setup_generators_options
|
||||
|
||||
_arguments \
|
||||
$generators_options \
|
||||
': :_guard "^-*" "name"' \
|
||||
'*: :_guard "^-*" "action"'
|
||||
}
|
||||
|
||||
_rails_console() {
|
||||
_arguments \
|
||||
'(- *)'{-h,--help}'[Show this help message]' \
|
||||
'(-s --sandbox)'{-s,--sandbox}'[Rollback database modifications on exit]' \
|
||||
--debugger'[Enable ruby-debugging for the console]'
|
||||
}
|
||||
|
||||
_rails_c() {
|
||||
_rails_console
|
||||
}
|
||||
|
||||
_rails_server() {
|
||||
_arguments \
|
||||
'(- *)'{-h,--help}'[Show this help message]' \
|
||||
'(-p --port)'{-p,--port=}'[Runs Rails on the specified port]: :_guard "[[\:digit\:]]#" "port"' \
|
||||
'(-b --binding)'{-b,--binding=}'[Binds Rails to the specified ip]:ip:_hosts' \
|
||||
'(-c --config)'{-c,--config=}'[Use custom rackup configuration file]:file:_files -g "*.ru"' \
|
||||
'(-d --daemon)'{-d,--daemon}'[Make server run as a Daemon]' \
|
||||
'(-u --debugger)'{-u,--debugger}'[Enable ruby-debugging for the server]' \
|
||||
'(-e --environment)'{-e,--environment=}'[Specifies the environment to run this server under (test/development/production)]:name:(test development production)' \
|
||||
'(-P --pid)'{-P,--pid=}'[Specifies the PID file]:pid:_files -g "*.pid"'
|
||||
}
|
||||
|
||||
_rails_s() {
|
||||
_rails_server
|
||||
}
|
||||
|
||||
_rails_dbconsole() {
|
||||
_arguments \
|
||||
'(- *)'--help'[Show this help message]' \
|
||||
'(-p --include-password)'{-p,--include-password}'[Automatically provide the password from database.yml]' \
|
||||
--mode'[Automatically put the sqlite3 database in the specified mode (html, list, line, column)]:mode:(html list line column)' \
|
||||
--header
|
||||
}
|
||||
|
||||
_rails_new() {
|
||||
local context state line curcontext="$curcontext"
|
||||
|
||||
local _a rails_options runtime_options
|
||||
__rails_setup_rails_options
|
||||
__rails_setup_runtime_options
|
||||
|
||||
_arguments -C \
|
||||
$rails_options \
|
||||
$runtime_options \
|
||||
'(-r,--ruby)'{-r,--ruby=}'[Path to the Ruby binary of your choice]:path' \
|
||||
'(-b,--builder)'{-b,--builder=}'[Path to a application builder (can be a filesystem path or URL)]: :->path_or_url' \
|
||||
'(-m,--template)'{-m,--template=}'[Path to an application template (can be a filesystem path or URL)]: :->path_or_url' \
|
||||
--skip-gemfile"[Don't create a Gemfile]" \
|
||||
--skip-bundle"[Don't run bundle install]" \
|
||||
'(-G,--skip-git)'{-G,--skip-git}'[Skip Git ignores and keeps]' \
|
||||
'(-O,--skip-active-record)'{-O,--skip-active-record}'[Skip Active Record files]' \
|
||||
'(-S,--skip-sprockets)'{-S,--skip-sprockets}'[Skip Sprockets files]' \
|
||||
'(-d,--database)'{-d,--database=}'[Preconfigure for selected database]:database:(mysql oracle postgresql sqlite3 frontbase ibm_db sqlserver jdbcmysql jdbcsqlite3 jdbcpostgresql jdbc)' \
|
||||
'(-j,--javascript)'{-j,--javascript=}'[Preconfigure for selected JavaScript library]:javascript' \
|
||||
'(-J --skip-javascript)'{-J,--skip-javascript}'[Skip JavaScript files]' \
|
||||
--dev'[Setup the application with Gemfile pointing to your Rails checkout]' \
|
||||
--edge'[Setup the application with Gemfile pointing to Rails repository]' \
|
||||
'(-T --skip-test-unit)'{-T,--skip-test-unit}'[Skip Test::Unit files]' \
|
||||
--old-style-hash"[Force using old style hash (:foo => 'bar') on Ruby >= 1.9]" \
|
||||
':app path:_directories'
|
||||
|
||||
case "$state" in
|
||||
path_or_url)
|
||||
_alternative \
|
||||
'files:path:_files -g "*.rb"' \
|
||||
'url:url:_urls'
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
_rails_application() {
|
||||
_rails_new
|
||||
}
|
||||
|
||||
_rails_db() {
|
||||
_rails_dbconsole
|
||||
}
|
||||
|
||||
_rails_destroy() {
|
||||
_rails_generate
|
||||
}
|
||||
|
||||
_rails_d() {
|
||||
_rails_destroy
|
||||
}
|
||||
|
||||
_rails_benchmarker() {
|
||||
_arguments \
|
||||
'(- *)'{-h,--help}'[Show this help message]' \
|
||||
'(-r --runs)'{-r,--runs}'[Number of runs]: :_guard "[[\:digit\:]]#" "number"' \
|
||||
'(-o --output)'{-o,--output}'[Directory to use when writing the results]:directory:_directories' \
|
||||
'(-m --metrics)'{-m,--metrics}'[Metrics to use]: :_values -s "," "metrics" "wall_time" "memory" "objects" "gc_runs" "gc_time"' \
|
||||
'*: :_guard "^-*" "ruby code"'
|
||||
}
|
||||
|
||||
_rails_profiler() {
|
||||
_arguments \
|
||||
'(- *)'{-h,--help}'[Show this help message]' \
|
||||
'(-r --runs)'{-r,--runs}'[Number of runs]: :_guard "[[\:digit\:]]#" "number"' \
|
||||
'(-o --output)'{-o,--output}'[Directory to use when writing the results]:directory:_directories' \
|
||||
'(-m --metrics)'{-m,--metrics}'[Metrics to use]: :_values -s "," "metrics" "process_time" "memory" "objects"' \
|
||||
'(-f --formats)'{-f,--formats}'[Formats to output to]: :_values -s "," "formats" "flat" "graph" "html" "call_tree" "call_stack"' \
|
||||
'*: :_guard "^-*" "ruby code"'
|
||||
}
|
||||
|
||||
_rails_plugin() {
|
||||
local context state line curcontext="$curcontext"
|
||||
|
||||
if (( CURRENT > 2 )); then
|
||||
(( CURRENT-- ))
|
||||
shift words
|
||||
_call_function - "_rails_plugin_${words[1]}" || _nothing
|
||||
else
|
||||
__rails_plugin_commands
|
||||
fi
|
||||
}
|
||||
|
||||
__rails_plugin_commands() {
|
||||
_values 'plugin command' \
|
||||
install'[Install plugin(s) from known repositories or URLs]' \
|
||||
remove'[Uninstall plugins]' \
|
||||
new
|
||||
}
|
||||
|
||||
_rails_plugin_install() {
|
||||
_arguments \
|
||||
'(-x --externals)'{-x,--externals}'[Use svn:externals to grab the plugin. Enables plugin updates and plugin versioning]' \
|
||||
'(-o --checkout)'{-o,--checkout}'[Use svn checkout to grab the plugin. Enables updating but does not add a svn:externals entry]' \
|
||||
'(-e --export)'{-e,--export}'[Use svn export to grab the plugin. Exports the plugin, allowing you to check it into your local repository. Does not enable updates or add an svn:externals entry]' \
|
||||
'(-q --quiet)'{-q,--quiet}'[Suppresses the output from installation. Ignored if -v is passed (rails plugin -v install ...)]' \
|
||||
'(-r --revision)'{-r,--revision=}'[Checks out the given revision from subversion or git. Ignored if subversion/git is not used]:revision' \
|
||||
'(-f --force)'{-f,--force}"[Reinstalls a plugin if it's already installed]" \
|
||||
'*:plugin:_urls'
|
||||
}
|
||||
|
||||
_rails_plugin_remove() {
|
||||
local -a plugins
|
||||
|
||||
plugins=($(_call_program rails_plugins ls -1 vendor/plugins))
|
||||
|
||||
_describe -t plugins 'plugin' plugins
|
||||
}
|
||||
|
||||
_rails_plugin_new() {
|
||||
_rails_new
|
||||
}
|
||||
|
||||
_rails_runner() {
|
||||
local context state line curcontext="$curcontext"
|
||||
|
||||
_arguments -C \
|
||||
'(- *)'{-h,--help}'[Show this help message]' \
|
||||
'(-e --environment)'{-e,--environment=}'[Specifies the environment for the runner to operate under (test/development/production)]:name:(test development production)' \
|
||||
': :->code_or_path'
|
||||
|
||||
case "$state" in
|
||||
code_or_path)
|
||||
_alternative \
|
||||
'files:filename:_files -g "*.rb"' \
|
||||
'codes:ruby code:_guard "^-*" "ruby code"'
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
_rails_r() {
|
||||
_rails_runner
|
||||
}
|
||||
|
||||
_rails "$@"
|
||||
|
||||
# Local Variables:
|
||||
# mode: Shell-Script
|
||||
# sh-indentation: 2
|
||||
# indent-tabs-mode: nil
|
||||
# sh-basic-offset: 2
|
||||
# End:
|
||||
# vim: ft=zsh sw=2 ts=2 et
|
Loading…
Reference in New Issue