a06f331eb8
CI / benchmark (push) Has been skipped
install-script / posix-syntax (push) Successful in 6m1s
CI / build-onnx (push) Failing after 6m43s
init-smoke / dry-run (push) Failing after 15m57s
security / govulncheck (push) Has been cancelled
security / trivy-fs (push) Has been cancelled
CI / test (1.26, ubuntu-latest) (push) Has been cancelled
Scorecard supply-chain security / Scorecard analysis (push) Has been cancelled
CI / test (1.26, macos-latest) (push) Has been cancelled
CI / build-windows (push) Has been cancelled
CI / lint (push) Has been cancelled
install-script / powershell-syntax (push) Has been cancelled
install-script / install (macos-14) (push) Has been cancelled
install-script / install (ubuntu-latest) (push) Has been cancelled
66 lines
1.9 KiB
Go
66 lines
1.9 KiB
Go
package parity
|
|
|
|
import (
|
|
_ "embed"
|
|
"encoding/json"
|
|
"sort"
|
|
)
|
|
|
|
//go:embed baseline.json
|
|
var baselineJSON []byte
|
|
|
|
// Baseline maps a language to its committed minimum resolved-cross-file-dependent
|
|
// coverage. The parity run refuses to let any language regress below its
|
|
// baseline, which is how COVERED stays COVERED over time.
|
|
type Baseline map[string]float64
|
|
|
|
// LoadBaseline returns the committed baseline. An empty baseline ("{}") means
|
|
// none has been captured yet — informational, not a failure.
|
|
func LoadBaseline() (Baseline, error) {
|
|
b := Baseline{}
|
|
if len(baselineJSON) == 0 {
|
|
return b, nil
|
|
}
|
|
if err := json.Unmarshal(baselineJSON, &b); err != nil {
|
|
return nil, err
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
// Regression records a language whose measured coverage fell below its baseline.
|
|
type Regression struct {
|
|
Language string
|
|
Baseline float64
|
|
Measured float64
|
|
}
|
|
|
|
// Check returns the languages whose measured coverage is below their baseline by
|
|
// more than epsilon. A language carried in the baseline but absent from the
|
|
// measured set is treated as 0 (it dropped out entirely). Languages with no
|
|
// baseline are not enforced.
|
|
func (b Baseline) Check(measured []LanguageCoverage, epsilon float64) []Regression {
|
|
got := make(map[string]float64, len(measured))
|
|
for _, m := range measured {
|
|
got[m.Language] = m.Coverage
|
|
}
|
|
var regs []Regression
|
|
for lang, base := range b {
|
|
m := got[lang] // absent → 0
|
|
if m < base-epsilon {
|
|
regs = append(regs, Regression{Language: lang, Baseline: base, Measured: m})
|
|
}
|
|
}
|
|
sort.Slice(regs, func(i, j int) bool { return regs[i].Language < regs[j].Language })
|
|
return regs
|
|
}
|
|
|
|
// MarshalBaseline renders a measured coverage set as a baseline JSON document
|
|
// (stable, indented) suitable for committing to baseline.json.
|
|
func MarshalBaseline(measured []LanguageCoverage) ([]byte, error) {
|
|
b := Baseline{}
|
|
for _, m := range measured {
|
|
b[m.Language] = m.Coverage
|
|
}
|
|
return json.MarshalIndent(b, "", " ")
|
|
}
|