Initial commit
This commit is contained in:
197
scripts/check-conformance.sh
Executable file
197
scripts/check-conformance.sh
Executable file
@@ -0,0 +1,197 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
#
|
||||
# TYPO3 Extension Conformance Checker
|
||||
#
|
||||
# Main script to orchestrate all conformance checks
|
||||
#
|
||||
|
||||
set -e
|
||||
|
||||
# Colors
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
# Configuration
|
||||
PROJECT_DIR="${1:-.}"
|
||||
REPORT_DIR="${PROJECT_DIR}/.conformance-reports"
|
||||
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
|
||||
REPORT_FILE="${REPORT_DIR}/conformance_${TIMESTAMP}.md"
|
||||
|
||||
# Script directory
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║ TYPO3 Extension Conformance Checker ║${NC}"
|
||||
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
echo -e "${BLUE}Standards Compliance Check:${NC}"
|
||||
echo -e " • TYPO3 Version: ${YELLOW}12.4 LTS / 13.x${NC}"
|
||||
echo -e " • PHP Version: ${YELLOW}8.1 / 8.2 / 8.3 / 8.4${NC}"
|
||||
echo -e " • PSR Standard: ${YELLOW}PSR-12 (Extended Coding Style)${NC}"
|
||||
echo -e " • Architecture: ${YELLOW}Dependency Injection, PSR-14 Events${NC}"
|
||||
echo ""
|
||||
|
||||
# Create report directory
|
||||
mkdir -p "${REPORT_DIR}"
|
||||
|
||||
# Check if directory exists
|
||||
if [ ! -d "${PROJECT_DIR}" ]; then
|
||||
echo -e "${RED}✗ Error: Directory ${PROJECT_DIR} not found${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "${PROJECT_DIR}"
|
||||
|
||||
# Check if this is a TYPO3 extension
|
||||
if [ ! -f "composer.json" ] && [ ! -f "ext_emconf.php" ]; then
|
||||
echo -e "${RED}✗ Error: Not a TYPO3 extension (composer.json or ext_emconf.php not found)${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✓ TYPO3 Extension detected${NC}"
|
||||
echo ""
|
||||
|
||||
# Initialize report
|
||||
cat > "${REPORT_FILE}" <<'EOF'
|
||||
# TYPO3 Extension Conformance Report
|
||||
|
||||
**Generated:** $(date -u +"%Y-%m-%d %H:%M:%S UTC")
|
||||
**Project:** $(basename "$(pwd)")
|
||||
|
||||
## Standards Checked
|
||||
|
||||
This conformance check validates your extension against the following standards:
|
||||
|
||||
| Standard | Version/Specification |
|
||||
|----------|----------------------|
|
||||
| **TYPO3 Core** | 12.4 LTS / 13.x |
|
||||
| **PHP** | 8.1 / 8.2 / 8.3 / 8.4 |
|
||||
| **Coding Style** | PSR-12 (Extended Coding Style) |
|
||||
| **Architecture** | Dependency Injection (PSR-11), PSR-14 Events, PSR-15 Middleware |
|
||||
| **Testing** | PHPUnit 10+, TYPO3 Testing Framework |
|
||||
| **Documentation** | reStructuredText (RST), TYPO3 Documentation Standards |
|
||||
|
||||
**Reference Documentation:**
|
||||
- [TYPO3 Extension Architecture](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ExtensionArchitecture/)
|
||||
- [TYPO3 Coding Guidelines](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/CodingGuidelines/)
|
||||
- [PHP Architecture](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/PhpArchitecture/)
|
||||
- [Testing Standards](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/Testing/)
|
||||
|
||||
---
|
||||
|
||||
## Summary
|
||||
|
||||
| Category | Score | Status |
|
||||
|----------|-------|--------|
|
||||
EOF
|
||||
|
||||
# Initialize scores
|
||||
total_score=0
|
||||
max_score=100
|
||||
|
||||
echo -e "${YELLOW}Running conformance checks...${NC}"
|
||||
echo ""
|
||||
|
||||
# 1. File Structure Check
|
||||
echo -e "${BLUE}[1/5] Checking file structure...${NC}"
|
||||
if bash "${SCRIPT_DIR}/check-file-structure.sh" "${PROJECT_DIR}" >> "${REPORT_FILE}"; then
|
||||
echo -e "${GREEN} ✓ File structure check complete${NC}"
|
||||
structure_score=18
|
||||
else
|
||||
echo -e "${YELLOW} ⚠ File structure issues found${NC}"
|
||||
structure_score=10
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# 2. Coding Standards Check
|
||||
echo -e "${BLUE}[2/5] Checking coding standards...${NC}"
|
||||
if bash "${SCRIPT_DIR}/check-coding-standards.sh" "${PROJECT_DIR}" >> "${REPORT_FILE}"; then
|
||||
echo -e "${GREEN} ✓ Coding standards check complete${NC}"
|
||||
coding_score=18
|
||||
else
|
||||
echo -e "${YELLOW} ⚠ Coding standards issues found${NC}"
|
||||
coding_score=12
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# 3. Architecture Check
|
||||
echo -e "${BLUE}[3/5] Checking PHP architecture...${NC}"
|
||||
if bash "${SCRIPT_DIR}/check-architecture.sh" "${PROJECT_DIR}" >> "${REPORT_FILE}"; then
|
||||
echo -e "${GREEN} ✓ Architecture check complete${NC}"
|
||||
arch_score=18
|
||||
else
|
||||
echo -e "${YELLOW} ⚠ Architecture issues found${NC}"
|
||||
arch_score=10
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# 4. Testing Check
|
||||
echo -e "${BLUE}[4/6] Checking testing infrastructure...${NC}"
|
||||
if bash "${SCRIPT_DIR}/check-testing.sh" "${PROJECT_DIR}" >> "${REPORT_FILE}"; then
|
||||
echo -e "${GREEN} ✓ Testing check complete${NC}"
|
||||
test_score=16
|
||||
else
|
||||
echo -e "${YELLOW} ⚠ Testing issues found${NC}"
|
||||
test_score=8
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# 5. PHPStan Baseline Check
|
||||
echo -e "${BLUE}[5/6] Checking PHPStan baseline hygiene...${NC}"
|
||||
if bash "${SCRIPT_DIR}/check-phpstan-baseline.sh" "${PROJECT_DIR}"; then
|
||||
echo -e "${GREEN} ✓ PHPStan baseline hygiene check passed${NC}"
|
||||
baseline_score=10
|
||||
else
|
||||
echo -e "${RED} ✗ PHPStan baseline violation detected${NC}"
|
||||
baseline_score=0
|
||||
fi
|
||||
echo ""
|
||||
|
||||
# 6. Generate comprehensive report
|
||||
echo -e "${BLUE}[6/6] Generating final report...${NC}"
|
||||
bash "${SCRIPT_DIR}/generate-report.sh" "${PROJECT_DIR}" "${REPORT_FILE}" \
|
||||
"${structure_score}" "${coding_score}" "${arch_score}" "${test_score}"
|
||||
echo ""
|
||||
|
||||
# Calculate total (including baseline hygiene score)
|
||||
total_score=$((structure_score + coding_score + arch_score + test_score + baseline_score))
|
||||
|
||||
# Display summary
|
||||
echo -e "${BLUE}╔════════════════════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${BLUE}║ Conformance Results ║${NC}"
|
||||
echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
echo -e " File Structure: ${structure_score}/20"
|
||||
echo -e " Coding Standards: ${coding_score}/20"
|
||||
echo -e " PHP Architecture: ${arch_score}/20"
|
||||
echo -e " Testing Standards: ${test_score}/20"
|
||||
echo -e " Baseline Hygiene: ${baseline_score}/10"
|
||||
echo -e " Best Practices: 10/10"
|
||||
echo ""
|
||||
echo -e " ${BLUE}Total Score: ${total_score}/100${NC}"
|
||||
echo ""
|
||||
|
||||
if [ ${total_score} -ge 80 ]; then
|
||||
echo -e "${GREEN}✓ EXCELLENT conformance level${NC}"
|
||||
elif [ ${total_score} -ge 60 ]; then
|
||||
echo -e "${YELLOW}⚠ GOOD conformance level (some improvements recommended)${NC}"
|
||||
elif [ ${total_score} -ge 40 ]; then
|
||||
echo -e "${YELLOW}⚠ FAIR conformance level (several issues to address)${NC}"
|
||||
else
|
||||
echo -e "${RED}✗ POOR conformance level (major improvements needed)${NC}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}Report saved to: ${REPORT_FILE}${NC}"
|
||||
echo ""
|
||||
|
||||
# Exit with appropriate code
|
||||
if [ ${total_score} -ge 60 ]; then
|
||||
exit 0
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
Reference in New Issue
Block a user