trax/scripts/validate_loc.sh

148 lines
4.4 KiB
Bash
Executable File

#!/bin/bash
# LOC Validation Script
# Checks file size limits and provides recommendations
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Configuration
MAX_LOC=300
MAX_LOC_JUSTIFIED=350
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
# Function to check if a file is Python code
is_python_file() {
local file="$1"
[[ "$file" == *.py ]]
}
# Function to count lines of code (excluding comments and empty lines)
count_loc() {
local file="$1"
if [[ ! -f "$file" ]]; then
echo 0
return
fi
# Count non-comment, non-empty lines
grep -v '^\s*#' "$file" | grep -v '^\s*$' | wc -l
}
# Function to analyze file structure for splitting recommendations
analyze_file_structure() {
local file="$1"
local loc="$2"
if [[ $loc -le $MAX_LOC ]]; then
return
fi
echo -e "${BLUE}📊 File Structure Analysis for $file:${NC}"
# Count classes, functions, and methods
local classes=$(grep "^class " "$file" 2>/dev/null | wc -l || echo 0)
local functions=$(grep "^def " "$file" 2>/dev/null | wc -l || echo 0)
local imports=$(grep "^import\|^from " "$file" 2>/dev/null | wc -l || echo 0)
echo -e " ${BLUE}• Classes:${NC} $classes"
echo -e " ${BLUE}• Functions/Methods:${NC} $functions"
echo -e " ${BLUE}• Import statements:${NC} $imports"
# Provide splitting recommendations
if [[ $classes -gt 1 ]]; then
echo -e " ${YELLOW}💡 Recommendation: Split into separate files per class${NC}"
fi
if [[ $functions -gt 10 ]]; then
echo -e " ${YELLOW}💡 Recommendation: Group related functions into modules${NC}"
fi
if [[ $imports -gt 5 ]]; then
echo -e " ${YELLOW}💡 Recommendation: Consider dependency organization${NC}"
fi
}
# Function to check LOC compliance
check_loc_compliance() {
local file="$1"
local loc
if [[ ! -f "$file" ]]; then
return 0
fi
loc=$(count_loc "$file")
if [[ $loc -gt $MAX_LOC_JUSTIFIED ]]; then
echo -e "${RED}❌ LOC Violation in $file: $loc lines (exceeds $MAX_LOC_JUSTIFIED limit)${NC}"
analyze_file_structure "$file" "$loc"
return 1
elif [[ $loc -gt $MAX_LOC ]]; then
echo -e "${YELLOW}⚠️ LOC Warning in $file: $loc lines (exceeds $MAX_LOC, but under $MAX_LOC_JUSTIFIED)${NC}"
echo -e " ${YELLOW} Consider splitting this file for better maintainability${NC}"
analyze_file_structure "$file" "$loc"
return 0 # Warning, not error
else
echo -e "${GREEN}✅ LOC OK: $file ($loc lines)${NC}"
return 0
fi
}
# Main function
main() {
local exit_code=0
local total_files=0
local violation_files=0
local warning_files=0
echo -e "${BLUE}📏 LOC Validation for Project${NC}"
echo -e "${BLUE}Target: < $MAX_LOC lines (${MAX_LOC_JUSTIFIED} max if justified)${NC}"
echo ""
# Check LOC compliance for all Python files
while IFS= read -r -d '' file; do
if is_python_file "$file"; then
total_files=$((total_files + 1))
if ! check_loc_compliance "$file"; then
if [[ $? -eq 1 ]]; then
violation_files=$((violation_files + 1))
exit_code=1
else
warning_files=$((warning_files + 1))
fi
fi
fi
done < <(find "$PROJECT_ROOT/src" -name "*.py" -print0)
echo ""
echo -e "${BLUE}📋 LOC Validation Summary:${NC}"
echo -e " ${BLUE}• Total Python files:${NC} $total_files"
echo -e " ${GREEN}• Files within limits:${NC} $((total_files - violation_files - warning_files))"
echo -e " ${YELLOW}• Files with warnings:${NC} $warning_files"
echo -e " ${RED}• Files with violations:${NC} $violation_files"
if [[ $violation_files -gt 0 ]]; then
echo ""
echo -e "${RED}🚫 LOC violations detected - must be fixed before task completion${NC}"
echo -e "${YELLOW} Consider splitting large files into focused modules${NC}"
elif [[ $warning_files -gt 0 ]]; then
echo ""
echo -e "${YELLOW}⚠️ LOC warnings detected - consider refactoring for maintainability${NC}"
else
echo ""
echo -e "${GREEN}🎉 All files within LOC limits!${NC}"
fi
exit $exit_code
}
# Run main function
main "$@"