summaryrefslogtreecommitdiff
path: root/completions/pytest
blob: 7457a84095f52070adfd993af163d37658e81f3b (plain)
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
# bash completion for pytest(1)                            -*- shell-script -*-

_pytest()
{
    local cur prev words cword split
    _init_completion -s -n : || return

    case $prev in
        --help | --maxfail | --report | --junit-prefix | --doctest-glob | -!(-*)[hkmorp])
            return
            ;;
        --import-mode)
            COMPREPLY=($(compgen -W "prepend append" -- "$cur"))
            return
            ;;
        --capture)
            COMPREPLY=($(compgen -W "fd sys no tee-sys" -- "$cur"))
            return
            ;;
        --lfnf | --last-failed-no-failures)
            COMPREPLY=($(compgen -W "all none" -- "$cur"))
            return
            ;;
        --tb)
            COMPREPLY=($(compgen -W "auto long short line native no" \
                -- "$cur"))
            return
            ;;
        --show-capture)
            COMPREPLY=($(compgen -W "no stdout stderr log all" -- "$cur"))
            return
            ;;
        --color)
            COMPREPLY=($(compgen -W "yes no auto" -- "$cur"))
            return
            ;;
        --pastebin)
            COMPREPLY=($(compgen -W "failed all" -- "$cur"))
            return
            ;;
        --junit-xml)
            _filedir xml
            return
            ;;
        --result-log | --log-file)
            _filedir log
            return
            ;;
        --ignore)
            _filedir
            return
            ;;
        --confcutdir | --basetemp | --rsyncdir | --rootdir)
            _filedir -d
            return
            ;;
        --doctest-report)
            COMPREPLY=($(compgen -W "none cdiff ndiff udiff only_first_failure" -- "$cur"))
            return
            ;;
        --assert)
            COMPREPLY=($(compgen -W "plain reinterp rewrite" -- "$cur"))
            return
            ;;
        --genscript)
            _filedir py
            return
            ;;
        --pythonwarnings | -!(-*)W)
            _xfunc python _python_warning_actions
            return
            ;;
        --numprocesses | -!(-*)n)
            COMPREPLY=($(compgen -W "{1..$(_ncpus)} auto" -- "$cur"))
            return
            ;;
        --dist)
            local modes=$("$1" --dist=nonexistent-distmode 2>&1 |
                command sed -e 's/[^[:space:][:alnum:]-]\{1,\}//g' \
                    -ne 's/.*choose from //p')
            COMPREPLY=($(compgen -W '$modes' -- "$cur"))
            return
            ;;
    esac

    $split && return

    if [[ $cur == -* ]]; then
        COMPREPLY=($(compgen -W '$(_parse_help "$1")' -- "$cur"))
        [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
        return
    fi

    if [[ $cur == *.py::*:* ]]; then
        local file=${cur/.py:*/.py}
        local class=${cur#*.py::} in_class=false
        local line
        class=${class%%:*}
        while IFS= read -r line; do
            if [[ $line =~ ^class[[:space:]]+${class}[[:space:]:\(] ]]; then
                in_class=true
            elif [[ $line =~ ^class[[:space:]] ]]; then
                in_class=false
            fi
            if $in_class && [[ $line =~ ^[[:space:]]+(async[[:space:]]+)?def[[:space:]]+(test_[A-Za-z0-9_]+) ]]; then
                COMPREPLY+=(${BASH_REMATCH[2]})
            fi
        done 2>/dev/null <"$file"
        ((!${#COMPREPLY[@]})) ||
            COMPREPLY=($(compgen -P "$file::$class::" -W '${COMPREPLY[@]}' \
                -- "${cur##*:?(:)}"))
        __ltrim_colon_completions "$cur"
        return
    elif [[ $cur == *.py:* ]]; then
        local file="${cur/.py:*/.py}" line
        while IFS= read -r line; do
            if [[ $line =~ ^class[[:space:]]+(Test[A-Za-z0-9_]+) ]]; then
                COMPREPLY+=(${BASH_REMATCH[1]})
            elif [[ $line =~ ^(async[[:space:]]+)?def[[:space:]]+(test_[A-Za-z0-9_]+) ]]; then
                COMPREPLY+=(${BASH_REMATCH[2]})
            fi
        done 2>/dev/null <"$file"
        ((!${#COMPREPLY[@]})) ||
            COMPREPLY=($(compgen -P "$file::" -W '${COMPREPLY[@]}' \
                -- "${cur##*.py:?(:)}"))
        __ltrim_colon_completions "$cur"
        return
    fi

    _filedir py
} &&
    complete -F _pytest pytest pytest-2 pytest-3 py.test py.test-2 py.test-3

# ex: filetype=sh