check-types.sh 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #!/bin/bash
  2. # Run type checkers with common options
  3. # Usage: ./check-types.sh [--mypy|--pyright|--both] [--strict] [path]
  4. set -e
  5. # Colors
  6. RED='\033[0;31m'
  7. GREEN='\033[0;32m'
  8. YELLOW='\033[1;33m'
  9. BLUE='\033[0;34m'
  10. NC='\033[0m'
  11. # Defaults
  12. CHECKER="both"
  13. STRICT=""
  14. TARGET="src"
  15. # Parse arguments
  16. while [[ $# -gt 0 ]]; do
  17. case $1 in
  18. --mypy)
  19. CHECKER="mypy"
  20. shift
  21. ;;
  22. --pyright)
  23. CHECKER="pyright"
  24. shift
  25. ;;
  26. --both)
  27. CHECKER="both"
  28. shift
  29. ;;
  30. --strict)
  31. STRICT="--strict"
  32. shift
  33. ;;
  34. *)
  35. TARGET="$1"
  36. shift
  37. ;;
  38. esac
  39. done
  40. # Check if target exists
  41. if [[ ! -e "$TARGET" ]]; then
  42. echo -e "${RED}Target not found: $TARGET${NC}"
  43. exit 1
  44. fi
  45. run_mypy() {
  46. echo -e "${BLUE}=== Running mypy ===${NC}"
  47. if ! command -v mypy &> /dev/null; then
  48. echo -e "${YELLOW}mypy not found. Install with: pip install mypy${NC}"
  49. return 1
  50. fi
  51. MYPY_ARGS="--show-error-codes --show-error-context --pretty"
  52. if [[ -n "$STRICT" ]]; then
  53. MYPY_ARGS="$MYPY_ARGS --strict"
  54. fi
  55. echo "mypy $MYPY_ARGS $TARGET"
  56. echo ""
  57. if mypy $MYPY_ARGS "$TARGET"; then
  58. echo -e "${GREEN}✓ mypy passed${NC}"
  59. return 0
  60. else
  61. echo -e "${RED}✗ mypy found errors${NC}"
  62. return 1
  63. fi
  64. }
  65. run_pyright() {
  66. echo -e "${BLUE}=== Running pyright ===${NC}"
  67. if ! command -v pyright &> /dev/null; then
  68. echo -e "${YELLOW}pyright not found. Install with: pip install pyright${NC}"
  69. return 1
  70. fi
  71. PYRIGHT_ARGS=""
  72. if [[ -n "$STRICT" ]]; then
  73. # Create temporary config for strict mode
  74. TEMP_CONFIG=$(mktemp)
  75. cat > "$TEMP_CONFIG" << EOF
  76. {
  77. "typeCheckingMode": "strict"
  78. }
  79. EOF
  80. PYRIGHT_ARGS="--project $TEMP_CONFIG"
  81. fi
  82. echo "pyright $PYRIGHT_ARGS $TARGET"
  83. echo ""
  84. if pyright $PYRIGHT_ARGS "$TARGET"; then
  85. echo -e "${GREEN}✓ pyright passed${NC}"
  86. [[ -n "$STRICT" ]] && rm -f "$TEMP_CONFIG"
  87. return 0
  88. else
  89. echo -e "${RED}✗ pyright found errors${NC}"
  90. [[ -n "$STRICT" ]] && rm -f "$TEMP_CONFIG"
  91. return 1
  92. fi
  93. }
  94. # Run checkers
  95. MYPY_STATUS=0
  96. PYRIGHT_STATUS=0
  97. case $CHECKER in
  98. mypy)
  99. run_mypy || MYPY_STATUS=$?
  100. ;;
  101. pyright)
  102. run_pyright || PYRIGHT_STATUS=$?
  103. ;;
  104. both)
  105. run_mypy || MYPY_STATUS=$?
  106. echo ""
  107. run_pyright || PYRIGHT_STATUS=$?
  108. ;;
  109. esac
  110. # Summary
  111. echo ""
  112. echo -e "${BLUE}=== Summary ===${NC}"
  113. if [[ "$CHECKER" == "both" ]] || [[ "$CHECKER" == "mypy" ]]; then
  114. if [[ $MYPY_STATUS -eq 0 ]]; then
  115. echo -e "mypy: ${GREEN}✓ passed${NC}"
  116. else
  117. echo -e "mypy: ${RED}✗ failed${NC}"
  118. fi
  119. fi
  120. if [[ "$CHECKER" == "both" ]] || [[ "$CHECKER" == "pyright" ]]; then
  121. if [[ $PYRIGHT_STATUS -eq 0 ]]; then
  122. echo -e "pyright: ${GREEN}✓ passed${NC}"
  123. else
  124. echo -e "pyright: ${RED}✗ failed${NC}"
  125. fi
  126. fi
  127. # Exit with error if any checker failed
  128. if [[ $MYPY_STATUS -ne 0 ]] || [[ $PYRIGHT_STATUS -ne 0 ]]; then
  129. exit 1
  130. fi