django.plugin.zsh 13.6 KB
Newer Older
Marc Abramowitz's avatar
Marc Abramowitz committed
1
2
3
4
#compdef manage.py

typeset -ga nul_args
nul_args=(
5
  '--verbosity=-[verbosity level; 0=minimal output, 1=normal output, 2=all output.]:Verbosity:((0\:minimal 1\:normal 2\:all))'
Marc Abramowitz's avatar
Marc Abramowitz committed
6
  '--settings=-[the Python path to a settings module.]:file:_files'
7
  '--pythonpath=-[a directory to add to the Python path.]:directory:_directories'
Marc Abramowitz's avatar
Marc Abramowitz committed
8
  '--traceback[print traceback on exception.]'
9
  "--no-color[Don't colorize the command output.]"
Marc Abramowitz's avatar
Marc Abramowitz committed
10
11
12
13
  "--version[show program's version number and exit.]"
  {-h,--help}'[show this help message and exit.]'
)

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
typeset -ga start_args
start_args=(
  '--template=-[The path or URL to load the template from.]:directory:_directories'
  '--extension=-[The file extension(s) to render (default: "py").]'
  '--name=-[The file name(s) to render.]:file:_files'
)

typeset -ga db_args
db_args=(
  '--database=-[Nominates a database. Defaults to the "default" database.]'
)

typeset -ga noinput_args
noinput_args=(
  '--noinput[tells Django to NOT prompt the user for input of any kind.]'
)

typeset -ga no_init_data_args
no_init_data_args=(
  '--no-initial-data[Tells Django not to load any initial data after database synchronization.]'
)

typeset -ga tag_args
tag_args=(
  '--tag=-[Run only checks labeled with given tag.]'
  '--list-tags[List available tags.]'
)

_managepy-check(){
Marc Abramowitz's avatar
Marc Abramowitz committed
43
  _arguments -s : \
44
45
46
47
48
49
50
51
    $tag_args \
    $nul_args && ret=0
}

_managepy-changepassword(){
  _arguments -s : \
    $db_args \
    $nul_args && ret=0
Marc Abramowitz's avatar
Marc Abramowitz committed
52
53
54
55
}

_managepy-createcachetable(){
  _arguments -s : \
56
57
58
59
60
61
62
63
64
65
    $db_args \
    $nul_args && ret=0
}

_managepy-createsuperuser(){
  _arguments -s : \
    '--username=-[Specifies the login for the superuser.]' \
    '--email=-[Specifies the email for the superuser.]' \
    $noinput_args \
    $db_args \
Marc Abramowitz's avatar
Marc Abramowitz committed
66
67
68
    $nul_args && ret=0
}

69
70
_managepy-collectstatic(){
  _arguments -s : \
71
72
73
74
75
76
77
78
    '--link[Create a symbolic link to each file instead of copying.]' \
    '--no-post-process[Do NOT post process collected files.]' \
    '--ignore=-[Ignore files or directories matching this glob-style pattern. Use multiple times to ignore more.]' \
    '--dry-run[Do everything except modify the filesystem.]' \
    '--clear[Clear the existing files using the storage before trying to copy or link the original file.]' \
    '--link[Create a symbolic link to each file instead of copying.]' \
    '--no-default-ignore[Do not ignore the common private glob-style patterns "CVS", ".*" and "*~".]' \
    $noinput_args \
79
80
81
    $nul_args && ret=0
}

Marc Abramowitz's avatar
Marc Abramowitz committed
82
83
_managepy-dbshell(){
  _arguments -s : \
84
    $db_args \
Marc Abramowitz's avatar
Marc Abramowitz committed
85
86
87
88
89
    $nul_args && ret=0
}

_managepy-diffsettings(){
  _arguments -s : \
90
    "--all[Display all settings, regardless of their value.]"
Marc Abramowitz's avatar
Marc Abramowitz committed
91
92
93
94
95
    $nul_args && ret=0
}

_managepy-dumpdata(){
  _arguments -s : \
96
97
98
99
100
101
102
103
    '--format=-[Specifies the output serialization format for fixtures.]:format:(json yaml xml)' \
    '--indent=-[Specifies the indent level to use when pretty-printing output.]' \
    '--exclude=-[An app_label or app_label.ModelName to exclude (use multiple --exclude to exclude multiple apps/models).]' \
    '--natural-foreign[Use natural foreign keys if they are available.]' \
    '--natural-primary[Use natural primary keys if they are available.]' \
    "--all[Use Django's base manager to dump all models stored in the database.]" \
    '--pks=-[Only dump objects with given primary keys.]' \
    $db_args \
Marc Abramowitz's avatar
Marc Abramowitz committed
104
105
106
107
108
109
    $nul_args \
    '*::appname:_applist' && ret=0
}

_managepy-flush(){
  _arguments -s : \
110
111
112
    $no_init_data_args \
    $db_args \
    $noinput_args \
Marc Abramowitz's avatar
Marc Abramowitz committed
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
    $nul_args && ret=0
}

_managepy-help(){
  _arguments -s : \
    '*:command:_managepy_cmds' \
    $nul_args && ret=0
}

_managepy_cmds(){
    local line
    local -a cmd
    _call_program help-command ./manage.py help \
      |& sed -n '/^ /s/[(), ]/ /gp' \
      | while read -A line; do cmd=($line $cmd) done
    _describe -t managepy-command 'manage.py command' cmd
}

_managepy-inspectdb(){
  _arguments -s : \
133
    $db_args \
Marc Abramowitz's avatar
Marc Abramowitz committed
134
135
136
137
138
    $nul_args && ret=0
}

_managepy-loaddata(){
  _arguments -s : \
139
140
    '--ignorenonexistent[Ignores entries in the serialized data for fields that do not currently exist on the model.]' \
    '--app=-[Only look for fixtures in the specified app.]:appname:_applist' \
Marc Abramowitz's avatar
Marc Abramowitz committed
141
    '*::file:_files' \
142
    $db_args \
Marc Abramowitz's avatar
Marc Abramowitz committed
143
144
145
    $nul_args && ret=0
}

146
_managepy-makemessages(){
Marc Abramowitz's avatar
Marc Abramowitz committed
147
  _arguments -s : \
148
149
150
151
152
153
154
155
156
    '--locale=-[Creates or updates the message files for the given locale(s) (e.g. pt_BR).]' \
    '--domain=-[The domain of the message files (default: "django").]' \
    '--all[Updates the message files for all existing locales.]' \
    '--extension=-[The file extension(s) to examine (default: "html,txt", or "js" if the domain is "djangojs").]' \
    '--symlinks[Follows symlinks to directories when examining source code and templates for translation strings.]' \
    '--ignore=-[Ignore files or directories matching this glob-style pattern.]' \
    "--no-default-ignore[Don't ignore the common glob-style patterns 'CVS', '.*', '*~' and '*.pyc'.]" \
    "--no-wrap[Don't break long message lines into several lines.]" \
    "--no-location[Don't write '#: filename:line' lines.]" \
i5ar's avatar
i5ar committed
157
    '--no-obsolete[Remove obsolete message strings.]' \
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
    '--keep-pot[Keep .pot file after making messages.]' \
    $nul_args && ret=0
}
_managepy-makemigrations(){
  _arguments -s : \
    '--dry-run[Just show what migrations would be made]' \
    '--merge[Enable fixing of migration conflicts.]' \
    '--empty[Create an empty migration.]' \
    $noinput_args \
    $nul_args && ret=0
}
_managepy-migrate(){
  _arguments -s : \
    '--fake[Mark migrations as run without actually running them]' \
    '--list[Show a list of all known migrations and which are applied]' \
    $no_init_data_args \
    $noinput_args \
    $db_args \
Marc Abramowitz's avatar
Marc Abramowitz committed
176
177
178
179
180
    $nul_args && ret=0
}

_managepy-runfcgi(){
  local state
181

Marc Abramowitz's avatar
Marc Abramowitz committed
182
183
184
185
186
  local fcgi_opts
  fcgi_opts=(
    'protocol[fcgi, scgi, ajp, ... (default fcgi)]:protocol:(fcgi scgi ajp)'
    'host[hostname to listen on..]:'
    'port[port to listen on.]:'
187
    'socket[UNIX socket to listen on.]:file:_files'
Marc Abramowitz's avatar
Marc Abramowitz committed
188
189
190
191
192
193
194
195
196
197
198
    'method[prefork or threaded (default prefork)]:method:(prefork threaded)'
    'maxrequests[number of requests a child handles before it is killed and a new child is forked (0 = no limit).]:'
    'maxspare[max number of spare processes / threads.]:'
    'minspare[min number of spare processes / threads.]:'
    'maxchildren[hard limit number of processes / threads.]:'
    'daemonize[whether to detach from terminal.]:boolean:(False True)'
    'pidfile[write the spawned process-id to this file.]:file:_files'
    'workdir[change to this directory when daemonizing.]:directory:_files'
    'outlog[write stdout to this file.]:file:_files'
    'errlog[write stderr to this file.]:file:_files'
  )
199

Marc Abramowitz's avatar
Marc Abramowitz committed
200
201
202
203
204
205
206
  _arguments -s : \
    $nul_args \
    '*: :_values "FCGI Setting" $fcgi_opts' && ret=0
}

_managepy-runserver(){
  _arguments -s : \
207
208
209
210
211
    '--ipv6[Tells Django to use an IPv6 address.]' \
    '--nothreading[Tells Django to NOT use threading.]' \
    '--noreload[Tells Django to NOT use the auto-reloader.]' \
    '--nostatic[Tells Django to NOT automatically serve static files at STATIC_URL.]' \
    '--insecure[Allows serving static files even if DEBUG is False.]' \
Marc Abramowitz's avatar
Marc Abramowitz committed
212
213
214
215
216
    $nul_args && ret=0
}

_managepy-shell(){
  _arguments -s : \
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
    '--plain[Tells Django to use plain Python, not IPython.]' \
    '--no-startup[When using plain Python, ignore the PYTHONSTARTUP environment variable and ~/.pythonrc.py script.]' \
    '--interface=-[Specify an interactive interpreter interface.]:INTERFACE:((ipython bpython))' \
    $nul_args && ret=0
}

_managepy-sql(){
  _arguments -s : \
    $db_args \
    $nul_args && ret=0
}

_managepy-sqlall(){
  _arguments -s : \
    $db_args \
    $nul_args && ret=0
}

_managepy-sqlclear(){
  _arguments -s : \
    $db_args \
    $nul_args && ret=0
}

_managepy-sqlcustom(){
  _arguments -s : \
    $db_args \
    $nul_args && ret=0
}

_managepy-dropindexes(){
  _arguments -s : \
    $db_args \
Marc Abramowitz's avatar
Marc Abramowitz committed
250
251
252
    $nul_args && ret=0
}

253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
_managepy-sqlflush(){
  _arguments -s : \
    $db_args \
    $nul_args && ret=0
}

_managepy-sqlindexes(){
  _arguments -s : \
    $db_args \
    $nul_args && ret=0
}

_managepy-sqlinitialdata(){
  _arguments -s : \
    $nul_args && ret=0
}

_managepy-sqlsequencereset(){
  _arguments -s : \
    $db_args \
    $nul_args && ret=0
}

_managepy-squashmigrations(){
  _arguments -s : \
    '--no-optimize[Do not try to optimize the squashed operations.]' \
    $noinput_args \
    $nul_args && ret=0
}

_managepy-startapp(){
  _arguments -s : \
    $start_args \
    $nul_args && ret=0
}
_managepy-startproject(){
  _arguments -s : \
    $start_args \
    $nul_args && ret=0
}
Marc Abramowitz's avatar
Marc Abramowitz committed
293
294
295

_managepy-syncdb() {
  _arguments -s : \
296
297
298
    $noinput_args \
    $no_init_data_args \
    $db_args \
Marc Abramowitz's avatar
Marc Abramowitz committed
299
300
301
302
303
    $nul_args && ret=0
}

_managepy-test() {
  _arguments -s : \
304
305
306
307
308
309
    '--failfast[Tells Django to stop running the test suite after first failed test.]' \
    '--testrunner=-[Tells Django to use specified test runner class instead of the one specified by the TEST_RUNNER setting.]' \
    '--liveserver=-[Overrides the default address where the live server (used with LiveServerTestCase) is expected to run from. The default value is localhost:8081.]' \
    '--top-level-directory=-[Top level of project for unittest discovery.]' \
    '--pattern=-[The test matching pattern. Defaults to test*.py.]:' \
    $noinput_args \
Marc Abramowitz's avatar
Marc Abramowitz committed
310
311
312
313
314
315
316
    '*::appname:_applist' \
    $nul_args && ret=0
}

_managepy-testserver() {
  _arguments -s : \
    '--addrport=-[port number or ipaddr:port to run the server on.]' \
317
318
    '--ipv6[Tells Django to use an IPv6 address.]' \
    $noinput_args \
Marc Abramowitz's avatar
Marc Abramowitz committed
319
320
321
322
323
324
    '*::fixture:_files' \
    $nul_args && ret=0
}

_managepy-validate() {
  _arguments -s : \
325
    $tag_args \
Marc Abramowitz's avatar
Marc Abramowitz committed
326
327
328
329
330
    $nul_args && ret=0
}

_managepy-commands() {
  local -a commands
331

Marc Abramowitz's avatar
Marc Abramowitz committed
332
  commands=(
333
334
335
336
337
    "changepassword:Change a user's password for django.contrib.auth."
    'check:Checks the entire Django project for potential problems.'
    'compilemessages:Compiles .po files to .mo files for use with builtin gettext support.'
    'createcachetable:Creates the table needed to use the SQL cache backend.'
    'createsuperuser:Used to create a superuser.'
338
    'collectstatic:Collect static files in a single location.'
339
340
    'dbshell:Runs the command-line client for the current DATABASE_ENGINE.'
    "diffsettings:Displays differences between the current settings.py and Django's default settings."
Marc Abramowitz's avatar
Marc Abramowitz committed
341
342
343
344
345
    'dumpdata:Output the contents of the database as a fixture of the given format.'
    'flush:Executes ``sqlflush`` on the current database.'
    'help:manage.py help.'
    'inspectdb:Introspects the database tables in the given database and outputs a Django model module.'
    'loaddata:Installs the named fixture(s) in the database.'
346
347
348
    'makemessages:Runs over the entire source tree of the current directory and pulls out all strings marked for translation.'
    'makemigrations:Creates new migration(s) for apps.'
    'migrate:Updates database schema. Manages both apps with migrations and those without.'
Marc Abramowitz's avatar
Marc Abramowitz committed
349
350
351
    'runfcgi:Run this project as a fastcgi (or some other protocol supported by flup) application,'
    'runserver:Starts a lightweight Web server for development.'
    'shell:Runs a Python interactive interpreter.'
352
    'showmigrations:Shows all available migrations for the current project.'
Marc Abramowitz's avatar
Marc Abramowitz committed
353
354
355
356
    'sql:Prints the CREATE TABLE SQL statements for the given app name(s).'
    'sqlall:Prints the CREATE TABLE, custom SQL and CREATE INDEX SQL statements for the given model module name(s).'
    'sqlclear:Prints the DROP TABLE SQL statements for the given app name(s).'
    'sqlcustom:Prints the custom table modifying SQL statements for the given app name(s).'
357
    'sqldropindexes:Prints the DROP INDEX SQL statements for the given model module name(s).'
Marc Abramowitz's avatar
Marc Abramowitz committed
358
359
360
361
    'sqlflush:Returns a list of the SQL statements required to return all tables in the database to the state they were in just after they were installed.'
    'sqlindexes:Prints the CREATE INDEX SQL statements for the given model module name(s).'
    "sqlinitialdata:RENAMED: see 'sqlcustom'"
    'sqlsequencereset:Prints the SQL statements for resetting sequences for the given app name(s).'
362
    'squashmigrations:Squashes an existing set of migrations (from first until specified) into a single new one.'
Marc Abramowitz's avatar
Marc Abramowitz committed
363
    "startapp:Creates a Django app directory structure for the given app name in this project's directory."
364
    "startproject:Creates a Django project directory structure for the given project name in this current directory."
Marc Abramowitz's avatar
Marc Abramowitz committed
365
366
367
368
369
    "syncdb:Create the database tables for all apps in INSTALLED_APPS whose tables haven't already been created."
    'test:Runs the test suite for the specified applications, or the entire site if no apps are specified.'
    'testserver:Runs a development server with data from the given fixture(s).'
    'validate:Validates all installed models.'
  )
370

Marc Abramowitz's avatar
Marc Abramowitz committed
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
  _describe -t commands 'manage.py command' commands && ret=0
}

_applist() {
  local line
  local -a apps
  _call_program help-command "python -c \"import os.path as op, re, django.conf, sys;\\
                                          bn=op.basename(op.abspath(op.curdir));[sys\\
                                          .stdout.write(str(re.sub(r'^%s\.(.*?)$' %
                                          bn, r'\1', i)) + '\n') for i in django.conf.settings.\\
                                          INSTALLED_APPS if re.match(r'^%s' % bn, i)]\"" \
                             | while read -A line; do apps=($line $apps) done
  _values 'Application' $apps && ret=0
}

_managepy() {
  local curcontext=$curcontext ret=1
388

Marc Abramowitz's avatar
Marc Abramowitz committed
389
390
391
392
393
394
395
396
397
398
399
400
  if ((CURRENT == 2)); then
    _managepy-commands
  else
    shift words
    (( CURRENT -- ))
    curcontext="${curcontext%:*:*}:managepy-$words[1]:"
    _call_function ret _managepy-$words[1]
  fi
}

compdef _managepy manage.py
compdef _managepy django
Yu Jiang's avatar
Yu Jiang committed
401
compdef _managepy django-admin
402
compdef _managepy django-admin.py
403
compdef _managepy django-manage