about summary refs log tree commit diff
path: root/Completion/Unix/Type/_python_modules
blob: b30848d83f0e9ed9734810275888f57aea6cdba5 (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
#autoload

_python_module_caching_policy () {
  local -a newer
  # rebuild if cache does not exist or is more than a week old
  newer=( "$1"(Nmw-1) )
  return $#newer
}

_python_modules () {
  local update_policy python expl

  case $words[1] in
    (python*) python=$words[1] ;;
    (pydoc*)  python=${words[1]/#pydoc/python} ;;
    (*)       python="python" ;;
  esac
  local cache_id=${${python//[^[:alnum:]]/_}#_}_modules
  local array_name=_${cache_id}

  zstyle -s ":completion:${curcontext}:" cache-policy update_policy
  [[ -z "$update_policy" ]] && \
    zstyle ":completion:${curcontext}:" \
      cache-policy _python_module_caching_policy

  if ( [[ ${(P)+array_name} -eq 0 ]] || _cache_invalid $cache_id ) &&
      ! _retrieve_cache $cache_id; then

    local script='import sys, pydoc
def f(p,m,d):
    if m.find(".") < 0: sys.stdout.write(m+"\n")
pydoc.ModuleScanner().run(f)'

    typeset -agU $array_name
    set -A $array_name \
      $(_call_program modules $python -c ${(q)script} 2>/dev/null)

    _store_cache $cache_id $array_name
  fi

  _wanted modules expl module compadd "$@" -a -- $array_name
}

_python_modules "$@"