fix(loader): accept grammar aliases
Some checks failed
Security Scan / security (push) Has been cancelled
Test / test (push) Has been cancelled

This commit is contained in:
Virgil 2026-04-03 07:51:09 +00:00
parent d3a12bfe74
commit 0e914911fa
2 changed files with 65 additions and 1 deletions

View file

@ -277,7 +277,7 @@ func loadGrammarNoun(fullKey, key string, v map[string]any, grammar *GrammarData
}
func loadGrammarSignals(fullKey string, v map[string]any, grammar *GrammarData) bool {
if grammar == nil || fullKey != "gram.signal" {
if grammar == nil || (fullKey != "gram.signal" && fullKey != "gram.signals") {
return false
}
loadSignalStringList := func(dst *[]string, raw any) {
@ -327,6 +327,14 @@ func loadGrammarArticle(fullKey string, v map[string]any, grammar *GrammarData)
}
}
}
if bg, ok := v["byGender"].(map[string]any); ok {
grammar.Articles.ByGender = make(map[string]string, len(bg))
for g, art := range bg {
if s, ok := art.(string); ok {
grammar.Articles.ByGender[g] = s
}
}
}
return true
}

View file

@ -683,6 +683,62 @@ func TestNewWithLoader_LoadsGrammarOnlyLocale(t *testing.T) {
}
}
func TestNewWithLoader_AcceptsGrammarAliases(t *testing.T) {
loaderFS := fstest.MapFS{
"en.json": &fstest.MapFile{
Data: []byte(`{
"gram": {
"article": {
"byGender": { "f": "la", "m": "le" }
},
"noun": {
"user": { "one": "user", "other": "users", "gender": "f" }
},
"signals": {
"noun_determiner": ["the"],
"verb_auxiliary": ["will"],
"verb_infinitive": ["to"],
"verb_negation": ["never"]
}
}
}`),
},
}
svc, err := NewWithLoader(NewFSLoader(loaderFS, "."))
if err != nil {
t.Fatalf("NewWithLoader() failed: %v", err)
}
data := GetGrammarData("en")
if data == nil {
t.Fatal("alias grammar data was not loaded")
}
if data.Articles.ByGender["f"] != "la" || data.Articles.ByGender["m"] != "le" {
t.Fatalf("article byGender alias not loaded: %+v", data.Articles.ByGender)
}
if got, want := data.Signals.NounDeterminers, []string{"the"}; !slices.Equal(got, want) {
t.Fatalf("signal alias noun_determiner = %v, want %v", got, want)
}
if got, want := data.Signals.VerbAuxiliaries, []string{"will"}; !slices.Equal(got, want) {
t.Fatalf("signal alias verb_auxiliary = %v, want %v", got, want)
}
if got, want := data.Signals.VerbInfinitive, []string{"to"}; !slices.Equal(got, want) {
t.Fatalf("signal alias verb_infinitive = %v, want %v", got, want)
}
if got, want := data.Signals.VerbNegation, []string{"never"}; !slices.Equal(got, want) {
t.Fatalf("signal alias verb_negation = %v, want %v", got, want)
}
if err := svc.SetLanguage("en"); err != nil {
t.Fatalf("SetLanguage(en) failed: %v", err)
}
SetDefault(svc)
if got := DefinitePhrase("user"); got != "la user" && got != "la User" {
t.Fatalf("DefinitePhrase(user) = %q, want article from byGender alias", got)
}
}
func TestFlattenPluralObject(t *testing.T) {
messages := make(map[string]Message)
raw := map[string]any{