101 lines
3.2 KiB
Bash
101 lines
3.2 KiB
Bash
# Setup hook for pytest
|
|
# shellcheck shell=bash
|
|
|
|
echo "Sourcing pytest-check-hook"
|
|
|
|
function _pytestIncludeExcludeExpr() {
|
|
local includeListName="$1"
|
|
local -n includeListRef="$includeListName"
|
|
local excludeListName="$2"
|
|
local -n excludeListRef="$excludeListName"
|
|
local includeString excludeString
|
|
if [[ -n "${includeListRef[*]-}" ]]; then
|
|
# ((element1) or (element2))
|
|
includeString="(($(concatStringsSep ") or (" "$includeListName")))"
|
|
fi
|
|
if [[ -n "${excludeListRef[*]-}" ]]; then
|
|
# and not (element1) and not (element2)
|
|
excludeString="${includeString:+ and }not ($(concatStringsSep ") and not (" "$excludeListName"))"
|
|
fi
|
|
echo "$includeString$excludeString"
|
|
}
|
|
|
|
function pytestCheckPhase() {
|
|
echo "Executing pytestCheckPhase"
|
|
runHook preCheck
|
|
|
|
# Compose arguments
|
|
local -a flagsArray=(-m pytest)
|
|
|
|
local -a _pathsArray
|
|
local path
|
|
|
|
_pathsArray=()
|
|
concatTo _pathsArray enabledTestPaths
|
|
for path in "${_pathsArray[@]}"; do
|
|
if [[ "$path" =~ "::" ]]; then
|
|
flagsArray+=("$path")
|
|
else
|
|
# The `|| kill "$$"` trick propagates the errors from the process substitutiton subshell,
|
|
# which is suggested by a StackOverflow answer: https://unix.stackexchange.com/a/217643
|
|
readarray -t -O"${#flagsArray[@]}" flagsArray < <(
|
|
@pythonCheckInterpreter@ - "$path" <<EOF || kill "$$"
|
|
import glob
|
|
import sys
|
|
path_glob=sys.argv[1]
|
|
if not len(path_glob):
|
|
sys.exit('Got an empty enabled tests path glob. Aborting')
|
|
path_expanded = glob.glob(path_glob)
|
|
if not len(path_expanded):
|
|
sys.exit('Enabled tests path glob "{}" does not match any paths. Aborting'.format(path_glob))
|
|
for path in path_expanded:
|
|
print(path)
|
|
EOF
|
|
)
|
|
fi
|
|
done
|
|
|
|
_pathsArray=()
|
|
concatTo _pathsArray disabledTestPaths
|
|
for path in "${_pathsArray[@]}"; do
|
|
if [[ "$path" =~ "::" ]]; then
|
|
flagsArray+=("--deselect=$path")
|
|
else
|
|
# Check if every path glob matches at least one path
|
|
@pythonCheckInterpreter@ - "$path" <<EOF
|
|
import glob
|
|
import sys
|
|
path_glob=sys.argv[1]
|
|
if not len(path_glob):
|
|
sys.exit('Got an empty disabled tests path glob. Aborting')
|
|
if next(glob.iglob(path_glob), None) is None:
|
|
sys.exit('Disabled tests path glob "{}" does not match any paths. Aborting'.format(path_glob))
|
|
EOF
|
|
flagsArray+=("--ignore-glob=$path")
|
|
fi
|
|
done
|
|
|
|
if [[ -n "${enabledTests[*]-}" ]] || [[ -n "${disabledTests[*]-}" ]]; then
|
|
flagsArray+=(-k "$(_pytestIncludeExcludeExpr enabledTests disabledTests)")
|
|
fi
|
|
|
|
if [[ -n "${enabledTestMarks[*]-}" ]] || [[ -n "${disabledTestMarks[*]-}" ]]; then
|
|
flagsArray+=(-m "$(_pytestIncludeExcludeExpr enabledTestMarks disabledTestMarks)")
|
|
fi
|
|
|
|
# Compatibility layer to the obsolete pytestFlagsArray
|
|
eval "flagsArray+=(${pytestFlagsArray[*]-})"
|
|
|
|
concatTo flagsArray pytestFlags
|
|
echoCmd 'pytest flags' "${flagsArray[@]}"
|
|
@pythonCheckInterpreter@ "${flagsArray[@]}"
|
|
|
|
runHook postCheck
|
|
echo "Finished executing pytestCheckPhase"
|
|
}
|
|
|
|
if [ -z "${dontUsePytestCheck-}" ] && [ -z "${installCheckPhase-}" ]; then
|
|
echo "Using pytestCheckPhase"
|
|
appendToVar preDistPhases pytestCheckPhase
|
|
fi
|