Add project type detection (pkg/detect) and complete PHP quality assurance package (pkg/php) with formatter, analyser, audit, security, refactor, mutation testing, test runner, pipeline stages, and QA runner that builds process.RunSpec for orchestrated execution. Co-Authored-By: Virgil <virgil@lethean.io>
73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
package php
|
|
|
|
// QAOptions configures the full QA pipeline.
|
|
type QAOptions struct {
|
|
Dir string
|
|
Quick bool // Only run quick checks
|
|
Full bool // Run all stages including slow checks
|
|
Fix bool // Auto-fix issues where possible
|
|
JSON bool // Output results as JSON
|
|
}
|
|
|
|
// QAStage represents a stage in the QA pipeline.
|
|
type QAStage string
|
|
|
|
const (
|
|
QAStageQuick QAStage = "quick" // fast checks: audit, fmt, stan
|
|
QAStageStandard QAStage = "standard" // standard checks + tests
|
|
QAStageFull QAStage = "full" // all including slow scans
|
|
)
|
|
|
|
// QACheckResult holds the result of a single QA check.
|
|
type QACheckResult struct {
|
|
Name string
|
|
Stage QAStage
|
|
Passed bool
|
|
Duration string
|
|
Error error
|
|
Output string
|
|
}
|
|
|
|
// QAResult holds the results of the full QA pipeline.
|
|
type QAResult struct {
|
|
Stages []QAStage
|
|
Checks []QACheckResult
|
|
Passed bool
|
|
Summary string
|
|
}
|
|
|
|
// GetQAStages returns the stages to run based on options.
|
|
func GetQAStages(opts QAOptions) []QAStage {
|
|
if opts.Quick {
|
|
return []QAStage{QAStageQuick}
|
|
}
|
|
if opts.Full {
|
|
return []QAStage{QAStageQuick, QAStageStandard, QAStageFull}
|
|
}
|
|
return []QAStage{QAStageQuick, QAStageStandard}
|
|
}
|
|
|
|
// GetQAChecks returns the checks for a given stage.
|
|
func GetQAChecks(dir string, stage QAStage) []string {
|
|
switch stage {
|
|
case QAStageQuick:
|
|
return []string{"audit", "fmt", "stan"}
|
|
case QAStageStandard:
|
|
checks := []string{}
|
|
if _, found := DetectPsalm(dir); found {
|
|
checks = append(checks, "psalm")
|
|
}
|
|
checks = append(checks, "test")
|
|
return checks
|
|
case QAStageFull:
|
|
checks := []string{}
|
|
if DetectRector(dir) {
|
|
checks = append(checks, "rector")
|
|
}
|
|
if DetectInfection(dir) {
|
|
checks = append(checks, "infection")
|
|
}
|
|
return checks
|
|
}
|
|
return nil
|
|
}
|