r"([a-z-]+://)" # scheme
r"([a-z_\d-]+:[a-z_\d-]+@)?" # user:password
r"(www\.)?" # www.
- r"((?<!\.)[a-z\d]+[a-z\d.-]+\.[a-z]{2,6}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|localhost)" # domain
+ r"((?<!\.)[a-z\d]+[a-z\d.-]+\.[a-z]{2,6}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|localhost)" # domain
r"(:\d{2,})?" # port number
r"(/[a-z\d_%+-]*)*" # folders
r"(\.[a-z\d_%+-]+)*" # file extension
True
>>> is_none_or_empty(None)
True
- >>> is_none_or_empty(" ")
+ >>> is_none_or_empty(" \t ")
True
>>> is_none_or_empty('Test')
False
def is_empty_string(in_str: Any) -> bool:
+ return is_empty(in_str)
+
+
+def is_empty(in_str: Any) -> bool:
"""
Checks if input is a string and empty or only whitespace.
- >>> is_empty_string('')
+ >>> is_empty('')
True
- >>> is_empty_string(' \t\t ')
+ >>> is_empty(' \t\t ')
True
- >>> is_empty_string('test')
+ >>> is_empty('test')
False
- >>> is_empty_string(100.88)
+ >>> is_empty(100.88)
False
- >>> is_empty_string([1, 2, 3])
+ >>> is_empty([1, 2, 3])
False
"""
return is_string(in_str) and in_str.strip() == ""
"""
Checks if a string is a valid ip (either v4 or v6).
- *Examples:*
-
>>> is_ip('255.200.100.75')
True
>>> is_ip('2001:db8:85a3:0000:0000:8a2e:370:7334')
--- /dev/null
+#!/bin/bash
+
+source /home/scott/bin/color_vars.sh
+
+ROOT=/home/scott/lib/python_modules
+DOCTEST=0
+UNITTEST=0
+INTEGRATION=0
+FAILURES=0
+
+dup() {
+ if [ $# -ne 2 ]; then
+ echo "Usage: dup <string> <count>"
+ return
+ fi
+ local times=$(seq 1 $2)
+ for x in ${times}; do
+ echo -n "$1"
+ done
+}
+
+make_header() {
+ if [ $# -ne 2 ]; then
+ echo "Usage: make_header <required title> <color>"
+ return
+ fi
+ local title="$1"
+ local title_len=${#title}
+ title_len=$((title_len + 4))
+ local width=70
+ local left=4
+ local right=$(($width-($title_len+$left)))
+ local color="$2"
+ dup '-' $left
+ echo -ne "[ ${color}${title}${NC} ]"
+ dup '-' $right
+ echo
+}
+
+
+while [[ $# -gt 0 ]]; do
+ key="$1"
+ case $key in
+ -a|--all)
+ DOCTEST=1
+ UNITTEST=1
+ INTEGRATION=1
+ ;;
+ -d|--doctests)
+ DOCTEST=1
+ ;;
+ -u|--unittests)
+ UNITTEST=1
+ ;;
+ -i|--integration)
+ INTEGRATION=1
+ ;;
+ *) # unknown option
+ echo "Usage: $0 [-a]|[-i][-u][-d]"
+ echo
+ echo "Runs tests under ${ROOT}. Options control which test types:"
+ echo
+ echo " -a | --all . . . . . . . . . . . . Run all types of tests"
+ echo " -d | --doctests . . . . . . . . . Run doctests"
+ echo " -u | --unittests . . . . . . . . . Run unittests"
+ echo " -i | --integration . . . . . . . . Run integration tests"
+ echo
+ echo "Argument $key was not recognized."
+ exit 1
+ ;;
+ esac
+ shift
+done
+
+if [ ${DOCTEST} -eq 1 ]; then
+ for doctest in $(grep -lR doctest ${ROOT}/*.py); do
+ BASE=$(basename ${doctest})
+ BASE="${BASE} (doctest)"
+ make_header "${BASE}" "${CYAN}"
+ OUT=$( python3 ${doctest} 2>&1 )
+ if [ "$OUT" == "" ]; then
+ echo "OK"
+ else
+ echo -e "${OUT}"
+ FAILURES=$((FAILURES+1))
+ fi
+ done
+fi
+
+if [ ${UNITTEST} -eq 1 ]; then
+ for test in $(find ${ROOT} -name "*_test.py" -print); do
+ BASE=$(basename ${test})
+ BASE="${BASE} (unittest)"
+ make_header "${BASE}" "${GREEN}"
+ ${test}
+ if [ $? -ne 0 ]; then
+ FAILURES=$((FAILURES+1))
+ fi
+ done
+fi
+
+if [ ${INTEGRATION} -eq 1 ]; then
+ for test in $(find ${ROOT} -name "*_itest.py" -print); do
+ BASE=$(basename ${test})
+ BASE="${BASE} (integration test)"
+ make_header "${BASE}" "${ORANGE}"
+ ${test}
+ if [ $? -ne 0 ]; then
+ FAILURES=$((FAILURES+1))
+ fi
+ done
+fi
+
+if [ ${FAILURES} -ne 0 ]; then
+ echo -e "${RED}There were ${FAILURES} failure(s).${NC}"
+fi