Add configurable report module composition

This commit is contained in:
2026-06-09 20:51:22 +00:00
parent eefb0681dc
commit 40639309b1
15 changed files with 586 additions and 19 deletions

View File

@@ -345,6 +345,47 @@ func TestRegistryDefinitionsDeclareDefaultModules(t *testing.T) {
}
}
func TestRegistryAppliesModuleOverridesWithoutChangingDefaults(t *testing.T) {
base := DefaultRegistry()
overridden, err := base.WithModuleOverrides(map[ID][]module.ConfigItem{
DailyToday: {
{ID: module.Metadata},
{ID: module.AlertDigest},
},
})
if err != nil {
t.Fatalf("WithModuleOverrides() error = %v", err)
}
definition, err := overridden.Lookup(DailyToday)
if err != nil {
t.Fatalf("Lookup(overridden) error = %v", err)
}
if !reflect.DeepEqual(definition.ModuleIDs(), []module.ID{module.Metadata, module.AlertDigest}) {
t.Fatalf("overridden ModuleIDs() = %#v, want metadata and alert digest", definition.ModuleIDs())
}
defaultDefinition, err := base.Lookup(DailyToday)
if err != nil {
t.Fatalf("Lookup(default) error = %v", err)
}
if len(defaultDefinition.ModuleIDs()) <= len(definition.ModuleIDs()) {
t.Fatalf("default ModuleIDs() = %#v, want original defaults unchanged", defaultDefinition.ModuleIDs())
}
}
func TestRegistryRejectsModuleOverrideForUnknownReport(t *testing.T) {
_, err := DefaultRegistry().WithModuleOverrides(map[ID][]module.ConfigItem{
ID("unknown"): {{ID: module.Metadata}},
})
if err == nil {
t.Fatal("WithModuleOverrides() error = nil, want unknown report")
}
if !strings.Contains(err.Error(), `unknown report "unknown"`) {
t.Fatalf("error = %q, want unknown report context", err.Error())
}
}
func TestResolvedMetadata(t *testing.T) {
location := mustLoadLocation(t)
resolved, err := Resolve(DailyToday, ResolveRequest{Now: mustParse("2026-05-29T05:00:00-05:00"), Location: location})

View File

@@ -84,6 +84,23 @@ func DefaultRegistry() Registry {
return registry
}
func (r Registry) WithModuleOverrides(overrides map[ID][]module.ConfigItem) (Registry, error) {
next := Registry{definitions: map[ID]Definition{}}
for id, definition := range r.definitions {
definition.Modules = append([]module.ConfigItem(nil), definition.Modules...)
next.definitions[id] = definition
}
for id, items := range overrides {
definition, ok := next.definitions[id]
if !ok {
return Registry{}, fmt.Errorf("unknown report %q", id)
}
definition.Modules = cloneModuleItems(items)
next.definitions[id] = definition
}
return next, nil
}
func dailyTodayModules() []module.ConfigItem {
return moduleItems(
module.Metadata,
@@ -154,6 +171,12 @@ func moduleItems(ids ...module.ID) []module.ConfigItem {
return items
}
func cloneModuleItems(items []module.ConfigItem) []module.ConfigItem {
cloned := make([]module.ConfigItem, len(items))
copy(cloned, items)
return cloned
}
func (r Registry) Lookup(id ID) (Definition, error) {
definition, ok := r.definitions[id]
if !ok {