Split per-type registration points into per-type files (#150)

Parallel package-type PRs conflict because every type edits the same shared lines (README tables, provider.go, server.go imports, the package type list, UI maps, the e2e caching table). A new type now only adds files.

- move per-type README sections into docs/<type>/{remote,local,virtual}.md
- split provider.go capability and metadata types into cap_*.go and metadata_*.go
- import providers via internal/provider/all, one file per type
- declare each package type in package_type_<type>.go, registered via init()
- split the e2e caching cases and UI colours/snippets into per-type files

Reviewed-on: #150
Co-authored-by: unkin-agent <unkin-agent@unkin.net>
Co-committed-by: unkin-agent <unkin-agent@unkin.net>
This commit was merged in pull request #150.
This commit is contained in:
2026-10-17 15:54:47 +11:00
committed by BenVincent
parent aaa923ffd1
commit 6e6481e09a
105 changed files with 1481 additions and 927 deletions
+3 -35
View File
@@ -4,42 +4,10 @@ import "fmt"
type PackageType string
const (
PackageGeneric PackageType = "generic"
PackageDocker PackageType = "docker"
PackageHelm PackageType = "helm"
PackagePyPI PackageType = "pypi"
PackageNPM PackageType = "npm"
PackageRPM PackageType = "rpm"
PackageDeb PackageType = "deb"
PackageAlpine PackageType = "alpine"
PackagePuppet PackageType = "puppet"
PackageTerraform PackageType = "terraform"
PackageGoProxy PackageType = "goproxy"
PackageCargo PackageType = "cargo"
PackageNuGet PackageType = "nuget"
PackageGitHubRPM PackageType = "github_rpm"
PackageGitHubDeb PackageType = "github_deb"
PackageGitHubAlpine PackageType = "github_alpine"
)
var validPackageTypes = map[PackageType]bool{}
var validPackageTypes = map[PackageType]bool{
PackageGeneric: true,
PackageDocker: true,
PackageHelm: true,
PackagePyPI: true,
PackageNPM: true,
PackageRPM: true,
PackageDeb: true,
PackageAlpine: true,
PackagePuppet: true,
PackageTerraform: true,
PackageGoProxy: true,
PackageCargo: true,
PackageNuGet: true,
PackageGitHubRPM: true,
PackageGitHubDeb: true,
PackageGitHubAlpine: true,
func registerPackageType(p PackageType) {
validPackageTypes[p] = true
}
func (p PackageType) Valid() bool {
+5
View File
@@ -0,0 +1,5 @@
package models
const PackageAlpine PackageType = "alpine"
func init() { registerPackageType(PackageAlpine) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackageCargo PackageType = "cargo"
func init() { registerPackageType(PackageCargo) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackageDeb PackageType = "deb"
func init() { registerPackageType(PackageDeb) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackageDocker PackageType = "docker"
func init() { registerPackageType(PackageDocker) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackageGeneric PackageType = "generic"
func init() { registerPackageType(PackageGeneric) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackageGitHubAlpine PackageType = "github_alpine"
func init() { registerPackageType(PackageGitHubAlpine) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackageGitHubDeb PackageType = "github_deb"
func init() { registerPackageType(PackageGitHubDeb) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackageGitHubRPM PackageType = "github_rpm"
func init() { registerPackageType(PackageGitHubRPM) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackageGoProxy PackageType = "goproxy"
func init() { registerPackageType(PackageGoProxy) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackageHelm PackageType = "helm"
func init() { registerPackageType(PackageHelm) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackageNPM PackageType = "npm"
func init() { registerPackageType(PackageNPM) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackageNuGet PackageType = "nuget"
func init() { registerPackageType(PackageNuGet) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackagePuppet PackageType = "puppet"
func init() { registerPackageType(PackagePuppet) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackagePyPI PackageType = "pypi"
func init() { registerPackageType(PackagePyPI) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackageRPM PackageType = "rpm"
func init() { registerPackageType(PackageRPM) }
+5
View File
@@ -0,0 +1,5 @@
package models
const PackageTerraform PackageType = "terraform"
func init() { registerPackageType(PackageTerraform) }
+40 -19
View File
@@ -1,33 +1,54 @@
package models_test
import (
"go/ast"
"go/parser"
"go/token"
"path/filepath"
"strings"
"testing"
"git.unkin.net/unkin/artifactapi/pkg/models"
)
// TestPackageTypeValid parses every package_type_<type>.go and asserts the
// const it declares is registered, so a type file missing its init() fails.
func TestPackageTypeValid(t *testing.T) {
valid := []models.PackageType{
models.PackageGeneric,
models.PackageDocker,
models.PackageHelm,
models.PackagePyPI,
models.PackageNPM,
models.PackageRPM,
models.PackageAlpine,
models.PackagePuppet,
models.PackageTerraform,
models.PackageGoProxy,
models.PackageCargo,
models.PackageNuGet,
models.PackageGitHubRPM,
models.PackageGitHubDeb,
models.PackageGitHubAlpine,
files, err := filepath.Glob("package_type_*.go")
if err != nil {
t.Fatal(err)
}
for _, pt := range valid {
if !pt.Valid() {
t.Errorf("expected %q to be valid", pt)
seen := 0
for _, f := range files {
if strings.HasSuffix(f, "_test.go") {
continue
}
file, err := parser.ParseFile(token.NewFileSet(), f, nil, 0)
if err != nil {
t.Fatal(err)
}
for _, decl := range file.Decls {
gd, ok := decl.(*ast.GenDecl)
if !ok || gd.Tok != token.CONST {
continue
}
for _, spec := range gd.Specs {
for _, v := range spec.(*ast.ValueSpec).Values {
lit := v.(*ast.BasicLit)
pt := models.PackageType(strings.Trim(lit.Value, `"`))
if !pt.Valid() {
t.Errorf("%s: %q is not registered", f, pt)
}
if want := "package_type_" + pt.String() + ".go"; f != want {
t.Errorf("%s declares %q, want it in %s", f, pt, want)
}
seen++
}
}
}
}
if seen == 0 {
t.Fatal("found no package types")
}
}