summary refs log tree commit diff
path: root/Completion/Unix/Command/_gem
blob: 7e244ccad94ab59b7bd511873164ffbbe8aa3caf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
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
250
251
252
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
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
#compdef gem -P gem[0-9.]#

local curcontext="$curcontext" state line expl ret=1
local -A opt_args def
local -a args cmds helptopics proxy lropts filter
local cmd="unknown"

proxy=(
  '(-p --http-proxy)'{-p,--http-proxy=}'[use HTTP proxy for remote operations]:proxy url:_urls'
)
lropts=( $proxy
  '${def[local]}(-l --local -r --remote -b --both)'{-l,--local}'[restrict operations to the LOCAL domain]'
  '${def[remote]}(-l --local -r --remote -b --both)'{-r,--remote}'[restrict operations to the REMOTE domain]'
  '${def[both]}(-l --local -r --remote -b --both)'{-b,--both}'[allow LOCAL and REMOTE operations]'
  '(-B --bulk-threshold)'{-B,--bulk-threshold=}'[specify threshold for switching to bulk synchronization]:threshold [1000]'
  '--clear-sources[clear the gem sources]'
  \*{-s,--source=}'[append specified URL to list of gem sources]:url:_urls'
)

_arguments -C -s \
  '(* -)'{-h,--help}'[display usage information]' \
  '(* -)'{-v,--version}'[display version information]' \
  '*::command:->command' && ret=0

if [[ $state = command ]]; then
  if (( CURRENT == 1 )); then
    cmd=subcommands
  else
    cmds=(
      build cert check cleanup contents dependency environment fetch
      generate_index help install info list lock mirror open outdated owner
      pristine push query rdoc search server signin signout sources
      specification stale uninstall unpack update which yank
    )
    cmds=( ${(M)cmds:#${words[1]}*} )
    if (( ${#cmds} == 1 )) || [[ $cmds[1] = install ]]; then
      cmd="$cmds[1]"
      curcontext="${curcontext%:*:*}:gem-${cmd}:"
    fi
  fi
  case $cmd in
    help)
      helptopics=(
        'commands:list all gem commands'
        'examples:show some examples of usage'
        'gem_dependencies:gem dependencies file guide'
        'platforms:show information about platforms'
      )
      _describe -t topics 'help topic' helptopics -- && ret=0
    ;&
    subcommands)
      cmds=( ${${${(M)${(f)"$(_call_program commands gem help commands)"}:#    [^ ]*}## #}/ ##/:} )
      _describe -t commands 'gem command' cmds -- && ret=0
      return ret
    ;;
    check|cleanup|contents|dependency|list|open|pristine|rdoc|uninstall|unpack|update)
      args+=( '(--all --skip)*:installed gem:->gems-local' )
    ;|
    fetch|install|lock|owner|search|yank)
      args+=( '*:gem:->gems-remote' )
    ;|
    cleanup|uninstall)
      args+=( '(-D --check-development)'{-D,--check-development}'[check development dependencies while uninstalling]' )
    ;|
    contents|pristine|rdoc)
      args+=( '(*)--all[apply to all installed gems]' )
    ;|
    info|list|query) def[local]='!' ;|
    search) def[remote]='!' ;|
    info|list|query|search)
      args+=( ${(e)lropts}
        '(-a --all)'{-a,--all}'[display all gem versions]'
        '(-e --exact)'{-e,--exact}'[use exact string matching instead of regex]'
        '(-I --no-installed -i --installed)'{-i,--installed}'[check if gem is installed]'
        '(-I --no-installed -i --installed)'{-I,--no-installed}'[check if gem is not installed]'
        '--no-versions[display only gem names]'
      )
    ;|
    list|query|search)
      args+=(
        '(-d --details)'{-d,--details}'[display detailed gem information]'
        '!(-d --details)--no-details'
      )
    ;|
    check|contents|dependency|fetch|install|list|open|pristine|query|rdoc|search|specification|uninstall|unpack|yank)
      args+=( '(-v --version)'{-v,--version=}'[specify version of gem]:version' )
    ;|
    dependency|fetch|install|outdated|specification|uninstall|update|yank)
      args+=( '--platform=[specify the platform of gem]:platform' )
    ;|
    dependency|fetch|install|list|query|search|specification|update)
      args+=( '--prerelease[include prerelease versions of a gem]' '!(--prerelease)--no-prerelease' )
    ;|
    install|unpack|update)
      args+=( '(-P --trust-policy)'{-P,--trust-policy=}'[specify gem trust policy]:policy' )
    ;|
    install|update)
      def[both]='!'
      args+=( ${(e)lropts}
        '(-N --no-document)--document=[generate documentation for installed gems]::documentation type:_sequence compadd - rdoc ri'
        '(-N --no-document --document)'{-N,--no-document}'[disable documentation generation]'
        '--build-root=[specify temporary installation root]:directory:_directories'
        '--vendor[install gem into the vendor directory]'
        '(-f --force)'{-f,--force}'[force gem to install, bypassing dependency checks]'
        "(-w --wrappers)--no-wrappers[don't install bin wrappers]"
        '--format-executable[add matching version suffix on executables to ruby]'
        "--user-install[install in user's home directory]"
        '--development[install additional development dependencies]'
        '--development-all[install development dependencies for all gems]'
        "--conservative[don't attempt to upgrade gems already meeting version requirement]"
        "--minimal-deps[don't upgrade any dependencies that already meet version requirements]"
        '--post-install-message[print post install message]'
        '(-g --file)'{-g,--file=}'[read from a gem dependencies API file and install the listed gems]:file:_files'
        '--without=[omit the named groups when installing gem dependencies]:group'
        "--default[add the gem's full specification to specifications/default and extract only its bin]"
        '--explain[rather than install the gems, indicate which would be installed]'
        "--no-lock[don't create a lock file]"
        '--suggestions[suggest alternates when gems are not found]'
      )
    ;|
    (un|)install|pristine|update)
      args+=(
        '(-n --bindir)'{-n,--bindir=}'[specify directory where binary files are located]:directory:_directories'
      )
    ;|
    (un|)install|update)
      args+=(
        '--ignore-dependencies[ignore dependency requirements]'
        '(-i --install-dir)'{-i,--install-dir=}'[specify gem repository directory to get installed gems]:directory:_directories'
      )
    ;|
    owner|push)
      args+=( $proxy )
    ;|
    owner|push|yank)
      args+=( '(-k --key)'{-k,--key=}'[use specified API key from ~/.gem/credentials]:key name' )
    ;|
    owner|push|signin|yank)
      args+=( '--host=[use another gemcutter-compatible host]:host:_urls' )
    ;|
    owner|push|signin)
      args+=( '--otp=[specify digit code for multifactor authentication]:code' )
    ;|
    install|pristine|update)
      args+=( '(-E --env-shebang)'{-E,--env-shebang}'[rewrite executables with a shebang of /usr/bin/env]' )
    ;|
    build)
      args+=(
        '(--strict)--force[skip validation of the spec]'
        '(--force)--strict[consider warnings as errors when validating the spec]'
        '(-o --output)'{-o+,--output=}'[output gem with the given filename]:file:_files'
        '-C+[run as if specified directory was the current directory]:directory:_directories'
        '1:gemspec file:_files -g "*.gemspec(-.)"'
      )
    ;;
    cert)
      args+=(
        '(-a --add)'{-a,--add=}'[add a trusted certificate.]:certificate' \
        '(-l --list)'{-l,--list=}'[list trusted certificates where the subject contains specified filter]:filter'
        '(-r --remove)'{-r,--remove=}'[remove trusted certificates where the subject contains specified filter]:filter'
        '(-b --build)'{-b,--build=}'[build private key and self-signed certificate for specified email address]:email address:_email_addresses -c'
        '(-C --certificate)'{-C,--certificate=}'[specify signing certificate for --sign]:certificate'
        '(-K --private-key)'{-K,--private-key=}'[specify key for --sign or --build]:key'
        '(-s --sign)'{-s,--sign=}'[sign specified certificate with the key from -K and the certificate from -C]:certificate'
        '(-d --days)'{-d,--days=}'[specify days before certificate expires]:days'
        '(-R --re-sign)'{-R,--re-sign}'[re-sign the certificate]'
      )
    ;;
    check)
      args+=(
        "--no-alien[don't report \"unmanaged\" or rogue files in the gem repository]"
        '--doctor[clean up uninstalled gems and broken specifications]'
        "--dry-run[don't remove files, only report what would be removed]"
        "--no-gems[don't check installed gems for problems]"
      )
    ;;
    cleanup)
      args+=(
        '(-n -d --dryrun)'{-n,-d,--dryrun}"[don't uninstall gems]"
        "--user-install[cleanup in user's home directory instead of GEM_HOME]"
      )
    ;;
    contents)
      args+=(
        '(-s --spec-dir)'{-s,--spec-dir=}'[search for gems in specific paths]:path:_sequence _directories'
        '(-l --lib-only)'{-l,--lib-only}"[only return files in the Gem's lib_dirs]"
        '--no-prefix[include installed path prefix]'
        '--show-install-dir[show only the gem install dir]'
      )
    ;;
    dependency)
      def[local]='!'
      args+=( ${(e)lropts}
        '(-R --reverse-dependencies)'{-R,--reverse-dependencies}'[include reverse dependencies in the output]'
        '--pipe[pipe format]'
      )
    ;;
    environment)
      args+=( '1:information:(gemdir gempath version remotesources platform)' )
    ;;
    fetch)
      def=( both \! local \! remote \! )
      args+=( ${(e)lropts} )
    ;;
    generate_index)
      args+=(
        '(-d --directory)'{-d,--directory=}'[specify repository base dir containing gems]:directory:_directories'
        '--update[update modern indexes with gems added since the last update]'
      )
    ;;
    lock)
      args+=( '(-s --strict)'{-s,--strict}'[fail if unable to satisfy a dependency]' )
    ;;
    open)
      args+=( '(-e --editor)'{-e,--editor=}'[open gem sources in specified editor]:editor:_command_names -e' )
    ;;
    outdated)
      args+=( ${(e)lropts} )
    ;;
    owner)
      args+=(
        '(-a --add)'{-a,--add=}'[add an owner]:email:_email_addresses -c'
        '(-r --remove)'{-r,--remove=}'[remove an owner]:email:_email_addresses -c'
      )
    ;;
    pristine)
      args+=(
        '(*)*--skip=[with --all, skip specified gem]:installed gem:->gems-local'
        "--no-extensions[don't restore gems with extensions in addition to regular gems]"
        '--only-executables[only restore executables]'
      )
    ;;
    push)
      args+=( '1:gem file:_files -g "*.gem(-.)"' )
    ;;
    query)
      args+=(
        '(-n --name-matches)'{-n,--name-matches=}'[specify regex to match against gem names]:gem name (regex):->gems-local'
      )
    ;;
    rdoc)
      args+=(
        '--rdoc[generate RDoc HTML]'
        '--no-ri[generate RI data]'
        '--overwrite[overwrite installed documents]'
      )
    ;;
    server)
      args+=(
        '(-p --port)'{-p,--port=}'[specify port to listen on]:port [8808]:_ports'
        '(-d --dir)'{-d,--dir=}'[specify directories from which to serve gems]:directory:_directories'
        '--daemon[run as a daemon]'
        '(-b --bind)'{-b,--bind=}'[specify addresses to bind]:host:_sequence _hosts'
        '(-l --launch)'{-l,--launch=}'[launch a browser window]:command:_command_names -e'
      )
    ;;
    sources)
      args+=( $proxy
        '(-a --add)'{-a,--add=}'[add source]:source URI:_urls'
        '(-l --list)'{-l,--list}'[list sources]'
        '(-r --remove)'{-r,--remove=}'[remove source]:source URI:_urls'
        '(-c --clear-all)'{-c,--clear-all}'[remove all sources (clear the cache)]'
        '(-u --update)'{-u,--update}'[update source cache]'
      )
    ;;
    specification)
      def[local]='!'
      args+=( ${(e)lropts}
      '--all[output specifications for all versions of the gem]'
        '!(--ruby --marshal)--yaml' '(--ruby --json)--marshal' '(--marshal --json 2)--ruby'
        '1:gem:->gems-local'
        '2:gemspec field:(name description version platform authors autorequire bindir cert_chain date dependencies email executable executables extensions extra_rdoc_files files homepage licenses metadata post_install_message rdoc_options require_paths required_ruby_version requirements rubyforge_project rubygems_version signing_key specification_version summary test_files)'
      )
    ;;
    uninstall)
      args+=(
        '(-a --all)'{-a,--all}'[uninstall all matching versions]'
        '(-x --executables)'{-x,--executables}'[uninstall applicable executables without confirmation]'
        "--no-user-install[uninstall from user's home directory]"
        "--format-executable[assume executable names match Ruby's prefix and suffix]"
        '--force[uninstall all versions of the named gems ignoring dependencies]'
        '--abort-on-dependent[prevent uninstalling gems that are depended on by other gems]'
        '--vendor[uninstall gem from the vendor directory]'
      )
    ;;
    unpack)
      args+=(
        '--spec[unpack the gem specification]'
        '--target=[specify target directory for unpacking]:directory:_directories'
      )
    ;;
    update)
      args+=( '--system[update the RubyGems system software]::version' )
    ;;
    which)
      args+=(
        '(-a --all)'{-a,--all}'[show all matching files]'
        '(-g --gems-first)'{-g,--gems-first}'[search gems before non-gems]'
        '*:file:_files'
      )
    ;;
    yank)
      args+=( '--otp=[specify code for multifactor authentication]:code' )
    ;;
  esac
  _arguments -C ${args:-'*: :_default'} \
    '(-)'{-h,--help}'[display usage information]' \
    '(-V --verbose --no-verbose)'{-V,--verbose,--no-verbose}'[set verbose level of output]' \
    '(-q --quiet -V --verbose --no-verbose)'{-q,--quiet}'[silence commands progress meter]' \
    '--silent[silence rubygems output]' \
    '--config-file=[use specified config file]:file:_files' \
    '--backtrace[show stack backtrace on errors]' \
    '--debug[turn on ruby debugging]' \
    '--norc[avoid loading any .gemrc file]' && ret=0

  if [[ $state == gems* ]]; then
    filter=( ${${opt_args[(I)-([lbr]|-local|-remote|-both)]}:-${${(M)state:#*-*}/gems-/--}} )
    _description gems expl gem
    compadd "$expl[@]" ${${(f)"$(_call_program gems gem list $filter -q --no-versions)"}%% *} && ret=0
  fi
fi

return ret