148 lines
4.4 KiB
Bash
Executable File
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 "$@"
|