summaryrefslogtreecommitdiffstats
path: root/completions/pytest
blob: 9ed257523bca30287c3a02552ba12775b3cfad8f (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
135
136
137
138
139
140
141
142
143
144
# bash completion for pytest(1)                            -*- shell-script -*-

_comp_cmd_pytest__option_choice_args()
{
    local modes=$("$1" "$2=bash-completion-nonexistent" 2>&1 |
        command sed -e 's/[^[:space:][:alnum:]_-]\{1,\}//g' \
            -ne 's/.*choose from //p')
    _comp_compgen -a -- -W '$modes'
}

_comp_cmd_pytest()
{
    local cur prev words cword was_split comp_args
    _comp_initialize -s -n : -- "$@" || return

    local noargopts='!(-*|*[kmorpcWn]*)'
    # shellcheck disable=SC2254
    case $prev in
        --help | --maxfail | --report | --junit-prefix | --doctest-glob | \
            -${noargopts}[hkmorp])
            return
            ;;
        --import-mode)
            _comp_compgen -- -W "prepend append importlib"
            return
            ;;
        --capture)
            _comp_compgen -- -W "fd sys no tee-sys"
            return
            ;;
        --lfnf | --last-failed-no-failures)
            _comp_compgen -- -W "all none"
            return
            ;;
        --tb)
            _comp_compgen -- -W 'auto long short line native no'
            return
            ;;
        --show-capture)
            _comp_compgen -- -W "no stdout stderr log all"
            return
            ;;
        --color)
            _comp_compgen -- -W "yes no auto"
            return
            ;;
        --pastebin)
            _comp_compgen -- -W "failed all"
            return
            ;;
        --junit-xml)
            _comp_compgen_filedir xml
            return
            ;;
        --result-log | --log-file)
            _comp_compgen_filedir log
            return
            ;;
        --ignore | -${noargopts}c)
            _comp_compgen_filedir
            return
            ;;
        --confcutdir | --basetemp | --rsyncdir | --rootdir)
            _comp_compgen_filedir -d
            return
            ;;
        --doctest-report)
            _comp_compgen -- -W 'none cdiff ndiff udiff only_first_failure'
            return
            ;;
        --assert)
            _comp_compgen -- -W "plain reinterp rewrite"
            return
            ;;
        --genscript)
            _comp_compgen_filedir py
            return
            ;;
        --pythonwarnings | -${noargopts}W)
            _comp_compgen -x python warning_actions
            return
            ;;
        --numprocesses | -${noargopts}n)
            local REPLY
            _comp_get_ncpus
            _comp_compgen -- -W "{1..$REPLY} auto"
            return
            ;;
        --dist | --vcr-record?(-mode))
            _comp_cmd_pytest__option_choice_args "$1" "$prev"
            return
            ;;
    esac

    [[ $was_split ]] && return

    if [[ $cur == -* ]]; then
        _comp_compgen_help
        [[ ${COMPREPLY-} == *= ]] && compopt -o nospace
        return
    fi

    if [[ $cur == *.py::*:* ]]; then
        local file=${cur/.py:*/.py}
        local class=${cur#*.py::} in_class=""
        local line
        class=${class%%:*}
        while IFS= read -r line; do
            if [[ $line =~ ^class[[:space:]]+${class}[[:space:]:\(] ]]; then
                in_class=set
            elif [[ $line =~ ^class[[:space:]] ]]; then
                in_class=""
            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[@]})) ||
            _comp_compgen -c "${cur##*:?(:)}" -- -P "$file::$class::" \
                -W '"${COMPREPLY[@]}"'
        _comp_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[@]})) ||
            _comp_compgen -c "${cur##*.py:?(:)}" -- -P "$file::" \
                -W '"${COMPREPLY[@]}"'
        _comp_ltrim_colon_completions "$cur"
        return
    fi

    _comp_compgen_filedir py
} &&
    complete -F _comp_cmd_pytest \
        pytest pytest-2 pytest-3 py.test py.test-2 py.test-3

# ex: filetype=sh